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

2件のコメント

  1. Code Beautifyというサイトには、Base64のEncodeとDecodeができますねぇ。
    https://codebeautify.org/base64-encode

    Clover ConfiguratorやOpenCore ConfiguratorのMenu>Tools>Hex ConverterにもHex Converterはついてはいるんですけど、なんか使いにくいんですよねぇ。

    そもそもBase64を使ってる理由ってわかんないですよね???なんででしたっけ?これをつかちゃった経緯も含めて知ってる偉い人がいれば教えてもらいたいですね。。。

    1. 確かに読みにくいし面倒ですよね。多分ASCII文字で16進数を書くよりは短く書けるという理由なのだと思いますが、写真や動画のデータ量に比べたら些細なことですね。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です