BASE64 について

Create:2001/07/24, update:2004/01/15

 

MIME規格って?

このところ、このページが何故かしら凄くヒットしているので、綺麗にしてみたりしました♪ ついでに文章も若干の修正っと(笑)

BASE64 ?って聞きなれない言葉だと思いますが、普段なにげなく使用しているメールで使用されていたりするのです。
「メールで添付ファイルを送る」って今では当たり前の様に使っていますが、1993年前までは実は行えなかったのって知ってました? そもそもインターネットで使用される文字というのは、7bitコードを前提で通信を行っていたために、wordのファイルや、jpg画像なんかのバイナリファイルを送る事ができなかったんです。

それに、バイナリファイルを送ることができてもそれを受け取る側が・・・・とか、いわゆるプロトコルが無かったため、1993年に MIME規格(RFC1521RFC1522)と呼ばれる手順が制定されました。これによって現在の「メールで添付ファイルを送る」っていうのが当たり前のようにできるようになったんです。

参考 : 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
[..戻る..]