BASE64 について
Create:2001/07/24, update:2004/01/15
MIME規格って?
このところ、このページが何故かしら凄くヒットしているので、綺麗にしてみたりしました♪ ついでに文章も若干の修正っと(笑)
BASE64 ?って聞きなれない言葉だと思いますが、普段なにげなく使用しているメールで使用されていたりするのです。
「メールで添付ファイルを送る」って今では当たり前の様に使っていますが、1993年前までは実は行えなかったのって知ってました? そもそもインターネットで使用される文字というのは、7bitコードを前提で通信を行っていたために、wordのファイルや、jpg画像なんかのバイナリファイルを送る事ができなかったんです。
それに、バイナリファイルを送ることができてもそれを受け取る側が・・・・とか、いわゆるプロトコルが無かったため、1993年に MIME規格(RFC1521/RFC1522)と呼ばれる手順が制定されました。これによって現在の「メールで添付ファイルを送る」っていうのが当たり前のようにできるようになったんです。
参考 : MIME 参考 : RFC2045 / 日本語訳 参考 : メールにかけられた呪文
BASE64エンコードとは
MIME規格では、バイナリファイルを送る/受ると手順が決まってもあいかわらず制御コードを含む8bitコードを送る事は許されていないため、なんとか7bitコードに変換して・・・・っていう事が考えだされました。これが BASE64 ってことなのです。
BASE64 は、変換元となるバイナリファイルから3バイトずつ読み込み、その読み込んだ3バイト(24bit)を今度は、6bitずつ読み込み(計4回)それを64種類の変換テーブルに従って変換していくというもの。
そーすることで、どんなバイナリファイルでも7bitコードに変換された文字列となるためメールで送れるということなんです。
ちなみに受信側では、変換を行った逆の動作を行えば、変換元バイナリファイルに復元できるって寸法です。
ちなみにこんな処理になります。
1.エンコードすべきデータから、3バイト取得する。 2.取得した3バイトを24ビットのデータ領域に設定する。 3.上位から6ビットを取り出し、その数値を下記の変換テーブルに従いキャラクター文字に変換する。 4.次の6ビット以降も同じ変換を行い、24ビットすべて変換する。 5.エンコードすべきデータが無くなるまで、1〜4の作業を繰り返す。 ※エンコードすべきデータが、2バイトしか無い場合は、それまでBASE64エンコード変換した文字列の 最終位置に'='を付加する。 ※エンコードすべきデータが、1バイトしか無い場合は、それまでBASE64エンコード変換した文字列の 最終位置に'=='を付加する。 変換テーブル:6ビットデータの「0〜63」を以下の文字列に変換する。 0 〜25:A〜Z 26〜51:a〜z 52〜61:0〜9 62 :+ 63 :/
あと、BASE64の 64 は、「6ビットのキャラクター、4の倍数単位」に変換すると言う意味を持ちます。
BASE64の長所と短所
上記で説明したようにバイナリデータを全て「6ビットのキャラクター、4の倍数単位」の変換を行 い7bitコードにしてしまうため、wordの文章だろうが、jpeg画像だろうがなんでもokという点が長所といえるでしょう。
逆に短所としては、変換元バイナリデータを3バイト単位で変換し4バイトとするため。変換後は4/3≒1.3倍の大きさとなってしまうことです。
BASE64エンコード例
'Hello' をBASE64エンコード変換します。まず、始めの3バイト('Hel')を取得し24ビット変換します。'Hel' = 010010000110010101101100 ここから6ビット取得(010010)し変換テーブルに従い 18='S' に変換します。これをあと3回繰り返し最終的に 'SGVs' と変換されることを確認します。
'Hello' を全てBASE64エンコード変換すると 'SGVsbG8' ですが、元データを3分割した最後の 'lo' は、2バイトなので、それまでにBASE64エンコード変換した文字列の最終位置に'='を付加します。すると 'SGVsbG8='となります。これの文字列が 'Hello' = 'SGVsbG8=' 最終的にBASE64エンコード変換した結果となります。
BASE64 エンコード/デコードのサンプルを作りましたのでよかったら見て理解してください。このソース gcc でコンパイルしましたが、特殊な命令は使用していないので大抵の Cコンパイラでコンパイルできると思います。
BASE64エンコードソース : http://www.sea-bird.org/doc/Cygwin/BASE64encode.c BASE64デコードソース : http://www.sea-bird.org/doc/Cygwin/BASE64decode.c
メールソフト と BASE64
メールソフトで BASE64 がどこで使われているの?って疑問ですよね。
えっと、Becky! で添付ファイル付きメールを選択して、メニューの「表示 − ソースの表示」を実行してみてください。
すると、下記の様なコードが表示されません??
--------=_1000695293.6F8.6E0 Content-Type: application/octet-stream; name="hoge.LZH" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="hoge.LZH" TgAtbGhkLQAAAAAAAAAADkalOyACAABNAwABDAACR1dGaXJlMTL/BQBAEAAb AEHgyXIWET/BAQC7PRcRP8EBAFizQcA+wQEFAADH9gAAUwAtbGg1LQEKAADm
そうです、base64 って文字が見受けられますね。それとその "TgAtb"から始まる文字列、そうですこれがエンコードされたデータなのです。なんとなくですが面白いでしょ♪
その他
むかし、私が BASE64 ってなにもんだ?っていうときに調べたリンク先です。役にたつかな?
バイナリデータの送受信 PerlでBase64 / MIME::Base64 Base64 によるエンコード・デコード for Delphi