サイトアイコン Boot macOS

base64コマンドの使い方

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

モバイルバージョンを終了