いつ見ても3日坊主@wiki
MIME Base64
最終更新:
ryu7k
-
view
MIME Base64
MIME規格
「メールで添付ファイルを送る」って今では当たり前の様に使っていますが、1993年前までは実は行えなかったのって知ってました? そもそもインターネットで使用される文字というのは、7bitコードを前提で通信を行っていたために、wordのファイルや、jpg画像なんかのバイナリファイルを送る事ができなかったんです。
それに、バイナリファイルを送ることができてもそれを受け取る側が・・・・とか、いわゆるプロトコルが無かったため、1993年に MIME規格(RFC1521/RFC1522)と呼ばれる手順が制定されました。これによって現在の「メールで添付ファイルを送る」っていうのが当たり前のようにできるようになったんです。
参考 : MIME
参考 : RFC2045 / 日本語訳
参考 : メールにかけられた呪文
参考 : RFC2045 / 日本語訳
参考 : メールにかけられた呪文
BASE64エンコードとは
MIME規格では、バイナリファイルを送る/受ると手順が決まってもあいかわらず制御コードを含む8bitコードを送る事は許されていないため、なんとか7bitコードに変換して・・・・っていう事が考えだされました。これが BASE64 ってことなのです。
BASE64 は、変換元となるバイナリファイルから3バイトずつ読み込み、その読み込んだ3バイト(24bit)を今度は、6bitずつ読み込み(計4回)それを64種類の変換テーブルに従って変換していくというもの。
そーすることで、どんなバイナリファイルでも7bitコードに変換された文字列となるためメールで送れるということなんです。
そーすることで、どんなバイナリファイルでも7bitコードに変換された文字列となるためメールで送れるということなんです。
ちなみに受信側では、変換を行った逆の動作を行えば、変換元バイナリファイルに復元できるって寸法です。
ちなみにこんな処理になります。
1.エンコードすべきデータから、3バイト取得する。
2.取得した3バイトを24ビットのデータ領域に設定する。
3.上位から6ビットを取り出し、その数値を下記の変換テーブルに従いキャラクター文字に変換する。
4.次の6ビット以降も同じ変換を行い、24ビットすべて変換する。
5.エンコードすべきデータが無くなるまで、1~4の作業を繰り返す。
※エンコードすべきデータが、2バイトしか無い場合は、それまでBASE64エンコード変換した文字列の
最終位置に'='を付加する。
※エンコードすべきデータが、1バイトしか無い場合は、それまでBASE64エンコード変換した文字列の
最終位置に'=='を付加する。
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倍の大きさとなってしまうことです。
〆リュ