{"id":2850,"date":"2020-07-31T07:54:02","date_gmt":"2020-07-30T22:54:02","guid":{"rendered":"http:\/\/matoken.org\/blog\/?p=2850"},"modified":"2020-07-31T08:02:42","modified_gmt":"2020-07-30T23:02:42","slug":"converting-binary-to-text-with-base91-a-little-more-efficiently","status":"publish","type":"post","link":"https:\/\/matoken.org\/blog\/2020\/07\/31\/converting-binary-to-text-with-base91-a-little-more-efficiently\/","title":{"rendered":"basE91\u3067\u5c11\u3057\u52b9\u7387\u3088\u304f\u30d0\u30a4\u30ca\u30ea\u3092\u30c6\u30ad\u30b9\u30c8\u306b\u5909\u63db"},"content":{"rendered":"<div class=\"paragraph\">\n<p>\u30d0\u30a4\u30ca\u30ea\u3092\u5229\u7528\u3067\u304d\u306a\u3044\u74b0\u5883\u3067\u306e\u30c7\u30fc\u30bf\u8ee2\u9001\u6642\u306bUNIX\u74b0\u5883\u3067\u306f\u53e4\u304f\u306f <code>uudecode, uuencode<\/code> \u304c\uff0c\u65e5\u672c\u306e\u30d1\u30bd\u30b3\u30f3\u901a\u4fe1\u3067\u306f <code>ish<\/code> \u306a\u3069\u304c\u4f7f\u308f\u308c\u3066\u3044\u307e\u3057\u305f\uff0e\u8fd1\u9803\u306f <code>base64<\/code> \u304c\u3088\u304f\u4f7f\u308f\u308c\u3066\u3044\u308b\u3088\u3046\u306b\u611f\u3058\u307e\u3059\uff0e<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\u3053\u308c\u3089\u306e\u30c4\u30fc\u30eb\u3067\u306f\u30d0\u30a4\u30ca\u30ea\u3092ASCII\u3067\u8868\u73fe\u3059\u308b\u305f\u3081\u30b5\u30a4\u30ba\u304c\u5927\u304d\u304f\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3059\uff0e\u3067\u3082\u5168\u3066\u306eASCII\u3092\u4f7f\u3063\u3066\u3044\u307e\u305b\u3093\uff0e<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\u4eca\u56de\u898b\u3064\u3051\u305fbasE91\u306fASCII\u306e0x21-0x7E\u306e\u3046\u3061 <code>-<\/code>, <code>\\<\/code>, <code>'<\/code> \u3092\u9664\u3044\u305f91\u6587\u5b57\u3092\u4f7f\u3063\u3066\u30c7\u30b3\u30fc\u30c9\u3059\u308b\u3053\u3068\u3067\u52b9\u7387\u3088\u304f\u3059\u308b\u3082\u306e\u306e\u3088\u3046\u3067\u3059\uff0e<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a href=\"http:\/\/base91.sourceforge.net\/\">basE91 &#8211; binary to ASCII text encoding<\/a><\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>\u65e9\u901f\u8a66\u3057\u3066\u307f\u307e\u3059\uff0eDebian\u30d1\u30c3\u30b1\u30fc\u30b8\u304c\u306a\u3044\u304b\u306a\u3068\u63a2\u3057\u307e\u3057\u305f\u304c\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\uff0e<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>(\u4ee5\u524d\u8981\u671b\u3055\u308c\u305f\u3053\u3068\u306f\u3042\u308b\u3088\u3046 <a href=\"https:\/\/bugs.debian.org\/cgi-bin\/bugreport.cgi?bug=706078\">#706078 &#8211; RFP: base91\u2009\u2014\u2009base91 encoder\/decoder &#8211; Debian Bug report logs<\/a> )<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>source\u3092\u8cb0\u3063\u3066\u304d\u3066make\u3057\u307e\u3059\uff0e<br \/>\n\u203bhash\u306f\u300c <a href=\"https:\/\/sourceforge.net\/projects\/base91\/files\/basE91\/0.6.0\/\">basE91 &#8211; Browse \/basE91\/0.6.0 at SourceForge.net<\/a> \u300d\u3067\u78ba\u8a8d\u3067\u304d\u308b\uff0e<\/p>\n<\/div>\n<div class=\"listingblock shell\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>$ wget http:\/\/downloads.sourceforge.net\/base91\/base91-0.6.0.tar.gz\n$ md5sum base91-0.6.0.tar.gz\ne227841d900cc463a162bd79775aeb54  base91-0.6.0.tar.gz\n$ sha1sum base91-0.6.0.tar.gz\n00cfd573ec8b3d0160dbf53e2c7a49b99a1aa720  base91-0.6.0.tar.gz\n$ tar tvf base91-0.6.0.tar.gz\n-rw-r--r-- 0\/0             575 2005-06-25 00:00 base91-0.6.0\/AWK\/README\n-rwxr-xr-x 0\/0             727 2006-11-02 05:13 base91-0.6.0\/AWK\/b91dec.awk\n-rw-r--r-- 0\/0             932 2006-09-04 03:00 base91-0.6.0\/PHP4\/README\n-rw-r--r-- 0\/0            1513 2006-11-02 05:13 base91-0.6.0\/PHP4\/base91.php\n-rw-r--r-- 0\/0             149 2006-09-04 03:00 base91-0.6.0\/test\/Makefile\n-rw-r--r-- 0\/0            4265 2006-11-02 05:13 base91-0.6.0\/test\/test.sh\n-rw-r--r-- 0\/0             332 2006-08-25 17:00 base91-0.6.0\/DOS-asm\/readme.txt\n-rw-r--r-- 0\/0            3487 2006-11-02 05:13 base91-0.6.0\/DOS-asm\/b91enc.asm\n-rw-r--r-- 0\/0            5034 2006-11-02 05:13 base91-0.6.0\/Java\/b91cli.java\n-rw-r--r-- 0\/0            3297 2006-11-02 05:13 base91-0.6.0\/Java\/basE91.java\n-rw-r--r-- 0\/0            1526 2006-11-02 05:13 base91-0.6.0\/Java\/license.txt\n-rw-r--r-- 0\/0             793 2006-11-02 05:13 base91-0.6.0\/Java\/readme.txt\n-rw-r--r-- 0\/0             112 2006-09-04 03:00 base91-0.6.0\/Java\/manifest.mf\n-rwxr-xr-x 0\/0             178 2006-11-02 05:13 base91-0.6.0\/Java\/build_jar.sh\n-rw-r--r-- 0\/0            7502 2006-11-02 05:13 base91-0.6.0\/cli.c\n-rw-r--r-- 0\/0            5066 2006-11-02 05:13 base91-0.6.0\/base91.c\n-rw-r--r-- 0\/0            1501 2006-11-02 05:13 base91-0.6.0\/LICENSE\n-rw-r--r-- 0\/0             561 2006-11-02 05:13 base91-0.6.0\/base91.h\n-rw-r--r-- 0\/0            2360 2006-11-02 05:13 base91-0.6.0\/README\n-rw-r--r-- 0\/0            1762 2006-11-02 05:13 base91-0.6.0\/base91.1\n-rw-r--r-- 0\/0             903 2006-09-04 03:00 base91-0.6.0\/Makefile\n-rw-r--r-- 0\/0            2330 2006-11-02 05:13 base91-0.6.0\/NEWS\n$ tar xf base91-0.6.0.tar.gz\n$ cd base91-0.6.0\n$ make\n$ .\/base91 -h\nUsage: base91 [OPTION]... [FILE]\nbasE91 encode or decode FILE, or standard input, to standard output.\n\n  -d, --decode          decode data\n  -m SIZE               use SIZE bytes of memory for buffers (suffixes b, K, M)\n  -o, --output=FILE     write to FILE instead of standard output\n  -v, --verbose         verbose mode\n  -w, --wrap=COLS       wrap encoded lines after COLS characters (default 76)\n  --help                display this help and exit\n  --version             output version information and exit\n\nWith no FILE, or when FILE is -, read standard input.<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>encode\u3057\u3066decode\u3057\u3066\u307f\u307e\u3059\uff0e<br \/>\n\u5f53\u305f\u308a\u524d\u3067\u3059\u304c\uff0cencode, decode\u3057\u3066\u3082diff\u3082hash\u3082\u540c\u3058\u3067\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock bash\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>$ .\/base91 .\/base91 -o .\/base91.base91\n$ .\/base91 -d .\/base91.base91 -o .\/base91.tmp\n$ diff .\/base91 .\/base91.tmp\n$ sha512sum .\/base91\nbc903be7c5b694841a9d0303351846f80f4798ad8848e8f298cf2c4818c68a2270b065db495b969503b25cdf672632e1cced18094f935fed47b75718c3c3e976  .\/base91\n$ .\/base91 .\/base91 | .\/base91 -d | sha512sum\nbc903be7c5b694841a9d0303351846f80f4798ad8848e8f298cf2c4818c68a2270b065db495b969503b25cdf672632e1cced18094f935fed47b75718c3c3e976  -<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p><code>basE91, base64, base32, uudecode<\/code> \u3067\u5909\u63db\u3057\u3066\u307f\u307e\u3059\uff0e<br \/>\n<code>basE91<\/code> \u304c\u4e00\u756a\u5c0f\u3055\u3044\u3067\u3059\u306d<\/p>\n<\/div>\n<div class=\"listingblock bash\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>$ ls --block-size=1 -s .\/base91\n16384 .\/base91\n$ .\/base91 .\/base91 | wc -c\n17340\n$ base64 .\/base91 | wc -c\n19615\n$ uuencode .\/base91 - | wc -c\n20024\n$ base32 .\/base91 | wc -c\n23538<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\u5727\u7e2e\u3059\u308b\u3068\u5927\u5206\u5c0f\u3055\u304f\u306a\u308a\u307e\u3059\uff0e\u5727\u7e2e\u306e\u307b\u3046\u304c\u305a\u3063\u3068\u52b9\u304d\u307e\u3059\u306d\uff0e<\/p>\n<\/div>\n<div class=\"listingblock bash\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>$ xz -c .\/base91 | wc -c\n4528\n$ xz -c .\/base91 | .\/base91 | wc -c\n5640\n$ xz -c .\/base91 | base64 | wc -c\n6120\n$ xz -c .\/base91 | uuencode - | wc -c\n6260\n$ xz -c .\/base91 | base32 | wc -c\n7344<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\u4ed6\u306e\u30d5\u30a1\u30a4\u30eb\u3082\u8a66\u3057\u3066\u307f\u307e\u3059\uff0e<code>\/usr\/bin<\/code> \u4ee5\u4e0b\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u9069\u5f53\u306b\u898b\u7e55\u3063\u3066\u6bd4\u8f03x5\u3067\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock bash\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>#!\/bin\/bash\n\nXZ=`mktemp`\nfor i in `seq 1 5`\ndo\n  CMD=`find \/usr\/bin -type f | shuf -n 1`\n  echo $CMD\n  echo -n \"raw  \"\n  stat -c %s $CMD\n  xz -9 -c $CMD &gt; $XZ\n  echo -n \"xz \"\n  stat -c %s $XZ\n  echo -n \"xz.uu  \"\n  uuencode $XZ - | wc -c\n  echo -n \"xz.base64  \"\n  base64 $XZ | wc -c\n  echo -n \"xz.base91  \"\n  base91 $XZ | wc -c\ndone\nrm $XZ<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"listingblock shell\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>$ bash .\/bin2ascii.bash | column -t\n\/usr\/bin\/lxc-snapshot\nraw                          27632\nxz                           6756\nxz.uu                        9328\nxz.base64                    9127\nxz.base91                    8418\n\/usr\/bin\/dh_installtmpfiles\nraw                          3263\nxz                           1540\nxz.uu                        2144\nxz.base64                    2084\nxz.base91                    1917\n\/usr\/bin\/pbmtogo\nraw                          10384\nxz                           3164\nxz.uu                        4380\nxz.base64                    4276\nxz.base91                    3942\n\/usr\/bin\/chartread\nraw                          3966528\nxz                           772956\nxz.uu                        1064980\nxz.base64                    1044169\nxz.base91                    963047\n\/usr\/bin\/spamassassin\nraw                          29898\nxz                           9608\nxz.uu                        13258\nxz.base64                    12981\nxz.base91                    11971<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\u304a\u307e\u3051?armel\u3067static link\u306a\u30d0\u30a4\u30ca\u30ea\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u305f\uff0e<a href=\"https:\/\/matoken.org\/blog\/2020\/07\/24\/hello-world-in-sipeed-lichee-nano\/\">Sipeed Lichee Nano<\/a> \u3067\u52d5\u304b\u306a\u3044\u304b\u306a?\u3068\uff0e<\/p>\n<\/div>\n<div class=\"listingblock shell\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>$ git diff HEAD~~ Makefile\ndiff --git a\/Makefile b\/Makefile\nindex 246aede..129acff 100644\n--- a\/Makefile\n+++ b\/Makefile\n@@ -1,7 +1,7 @@\n-CFLAGS = -Wall -W -O2\n-LDFLAGS = -s\n+CFLAGS = -static -Wall -W -O2\n+LDFLAGS = -static -s\n\n-CC = gcc\n+CC = arm-linux-gnueabi-gcc\n INSTALL = install\n INSTALL_DATA = $(INSTALL) -m 444\n INSTALL_PROGRAM = $(INSTALL) -m 555<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p><code>qemu-arm-static<\/code> \u3067\u306f\u52d5\u304f\u306e\u3092\u78ba\u8a8d\u3057\u305f\u3051\u3069\u5b9f\u6a5f\u3067\u306f\u672a\u78ba\u8a8d\u3067\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock shell\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>$ file .\/base91\n.\/base91: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, BuildID[sha1]=88ec4ccbf69c4bb41640b5de63b6b5373b7e5365, for GNU\/Linux 3.2.0, stripped\n$ ldd .\/base91\n        not a dynamic executable\n$ echo &#x1f63a; | qemu-arm-static .\/base91 | pee cat \"qemu-arm-static .\/base91 -d\"\n=~m6xHA\n&#x1f63a;<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\u4ee5\u4e0b\u306b\u30d0\u30a4\u30ca\u30ea\u3068uuencode\u3057\u305f\u3082\u306e\u304c\u7f6e\u3044\u3066\u3042\u308a\u307e\u3059\uff0e<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a href=\"https:\/\/github.com\/matoken\/basE91\/releases\/tag\/0.6.0\" class=\"bare\">https:\/\/github.com\/matoken\/basE91\/releases\/tag\/0.6.0<\/a><\/li>\n<li><a href=\"https:\/\/gist.github.com\/matoken\/c2bc8dadfdcb00da99fd1b4c2f12ce1c\" class=\"bare\">https:\/\/gist.github.com\/matoken\/c2bc8dadfdcb00da99fd1b4c2f12ce1c<\/a><\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>blog\u5143\u306ememo<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a href=\"https:\/\/wiki.matoken.org\/unix\/commands\/basE91\">unix:commands:base91 [wiki.matoken.org<\/a>]<\/li>\n<\/ul>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\">\u74b0\u5883<\/div>\n<div class=\"content\">\n<pre>$ dpkg-query -W gcc-10-arm-linux-gnueabi qemu-user-static gcc coreutils sharutils\ncoreutils       8.32-3\ngcc     4:10.1.0-1\ngcc-10-arm-linux-gnueabi        10.2.0-3cross2\nqemu-user-static        1:5.0-13\nsharutils       1:4.15.2-5\n$ lsb_release -dr\nDescription:    Debian GNU\/Linux bullseye\/sid\nRelease:        unstable\n$ uname -m\nx86_64<\/pre>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u30d0\u30a4\u30ca\u30ea\u3092\u5229\u7528\u3067\u304d\u306a\u3044\u74b0\u5883\u3067\u306e\u30c7\u30fc\u30bf\u8ee2\u9001\u6642\u306bUNIX\u74b0\u5883\u3067\u306f\u53e4\u304f\u306f uudecode, uuencode \u304c\uff0c\u65e5\u672c\u306e\u30d1\u30bd\u30b3\u30f3\u901a\u4fe1\u3067\u306f ish \u306a\u3069\u304c\u4f7f\u308f\u308c\u3066\u3044\u307e\u3057\u305f\uff0e\u8fd1\u9803\u306f base64 \u304c\u3088\u304f\u4f7f\u308f\u308c\u3066\u3044\u308b\u3088\u3046\u306b\u611f\u3058\u307e\u3059 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"webmentions_disabled_pings":false,"webmentions_disabled":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[7,6,199],"tags":[148,561,559,555,560],"class_list":["post-2850","post","type-post","status-publish","format-standard","hentry","category-debian-linux","category-linux","category-sid","tag-ascii","tag-base64","tag-base91","tag-uudecode","tag-uuencode"],"_links":{"self":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts\/2850","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/comments?post=2850"}],"version-history":[{"count":0,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts\/2850\/revisions"}],"wp:attachment":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/media?parent=2850"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/categories?post=2850"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/tags?post=2850"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}