Table of Contents
Base64変換(文字列を変換)
echo -n "AMD RX 580" | base64 QU1EIFJYIDU4MA==
Base64変換(16進数を変換)
echo -en "\x9B\x3e\x00\x00" | base64 mz4AAA==
Base64逆変換(文字列をデコード)
echo QU1EIFJYIDU4MA== | base64 -D AMD RX 580
Base64逆変換(16進数をデコード)
echo mz4AAA== | base64 -D | hexdump 0000000 9b 3e 00 00 0000004
いつも使い方を忘れてしまうのでメモしておきます。Base64はバイナリーデータを文字で表記する場面でよく使用されます。config.plistでもお馴染みです。なので、時々、変換・逆変換したいことがあります。そのためのツールはたくさんありますし、変換してくれるwebページもあります。でも、ターミナルから使えるbase64コマンドならすぐに使えて便利です。使い方さえ忘れていなければ。
Base64の仕組み
文字しか表記できない・通信できない環境で、任意のデータを効率良く表現するために考えられました。英大文字、英子文字、数字、記号(+と/) に数字を割り当てます。アルファベットは26文字なので、Aが0でZが25です。引き続き小文字のaに26を割り当ててzまで使うと51まで表現できます。この後、数字の0 (=52)から9 (=61)を割り当てると、61まで表現できます。後2つあればキリが良いので、+ (=62)と/ (=63)を最後に使います。これで、A~Z, a~z, 0-9, +, /を使って0から63を表現できます。64進数です。ビット数は6ビットになります。
通常のコンピュータのデータはバイト単位、8ビット単位です。なので上位から6ビットごとに区切って変換します。端数は0ということにします。例えば、ASCIIコードで大文字のAは、0x41です。ビットで表すと、0100 0001です。6ビットに分けると、010000 01です。端数に0を追加すると、010000 010000です。010000は10進数で16になり、これが2個続きます。16には、Base64では、17番目のアルファベットQが割り当てられています。なのでBase64で表すとQQになります。また、Base64では4文字の倍数になるよう調整します。足りない部分には=を追加します。ということで、大文字AをBase64で表現すると、QQ==になります。
base64コマンド
macOSにはターミナルから使えるbase64コマンドがあります。使い方は以下です。
base64 [-h | -D | -d] [-b count] [-i input_file] [-o output_file]
I, oオプションで入出力ファイルを指定できますが、指定しなければ標準入出力が使用されます。hはヘルプ表示です。bで数値を指定すると、出力に改行を入れてくれます。Dオプションしか使うことはないと思います。オプションなしならエンコード、Dオプションでデコードです。
標準入出力を使うので、echoコマンドをパイプします。echo helloとタイプするとhelloという文字が表示されるのですが、デフォルトでは最後に改行が入ります。-nオプションで改行を出さないよう指定できます。echoコマンドを、16進数標示するhexdumpコマンドにパイプしてみます。こんな感じです。0aが改行コードです。
% echo hello | hexdump 0000000 68 65 6c 6c 6f 0a 0000006 % echo -n hello | hexdump 0000000 68 65 6c 6c 6f 0000005
なのでhelloという文字列だけ(改行は不要)をBase64にしたい場合は、
% echo -n hello | base64 aGVsbG8=
とします。結果が7文字だったので=が1個追加されました。-Dオプションで元に戻してみましょう。
% echo aGVsbG8= | base64 -D hello
echoで16進数を出すのはちょっと面倒です。0x01, 0x02, 0x03という3バイトを出すには、”\x01\x02\x03″と書きます。\xで次の2文字が16進数だということを表現します。またこのように\xで16進数渡すためには-eオプションが必要です。hexdumpにパイプして確認します。
% echo -en "\x01\x02\x03" | hexdump 0000000 01 02 03 0000003
これをbase64にパイプすれば、変換できます。
% echo -en "\x01\x02\x03" | base64 AQID
逆変換して確認しておきます。
% echo AQID | base64 -D | hexdump 0000000 01 02 03 0000003