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
Code Beautifyというサイトには、Base64のEncodeとDecodeができますねぇ。
https://codebeautify.org/base64-encode
Clover ConfiguratorやOpenCore ConfiguratorのMenu>Tools>Hex ConverterにもHex Converterはついてはいるんですけど、なんか使いにくいんですよねぇ。
そもそもBase64を使ってる理由ってわかんないですよね???なんででしたっけ?これをつかちゃった経緯も含めて知ってる偉い人がいれば教えてもらいたいですね。。。
確かに読みにくいし面倒ですよね。多分ASCII文字で16進数を書くよりは短く書けるという理由なのだと思いますが、写真や動画のデータ量に比べたら些細なことですね。