たまにはVC++

『MIME base64 エンコーダを作る』
2003.Mar.05

base64とは?

MIMEエンコードというのは、インターネット上でメディア(画像など)をやり取りする場合に用いられる符号化(Encode)の事です。
エンコード方法は数多く存在しますが、base64というのは主にメールなどの添付ファイルに用いられる事が多く、私たちに一番身近なエンコード方法です。
そもそも符号化ってなに?

英語で書くと「Encode」で「エンコード」と読みます。
符号化とは、元々のデータをある法則(アルゴリズム)に基づいて元のデータとは違う形式に変換することです。
もちろん、また元に戻さないといけないので、この元に戻す事を「Decode」「デコード」「復号化」といいます。

base64は上で書いた通り、メールの添付ファイル部分に使われる符号化で、世の中に広く使われています。
符号化のアルゴリズムはすごく簡単なので、覚えておいて損はないでしょう。
ちなみに、base64エンコードを使用する理由は、RFCなんちゃらという文書(RFC2045かな?)に書かれているそうです。
まぁ「仕様」に近いようです。
base64エンコード/デコードするソース

とりあえず最初にソースです。

ソース

あんまりコマンドラインプログラムは慣れてないんですが、こんな感じでしょうか。
Win32向けDOSアプリです(笑)

encode_base64がbase64エンコードルーチンでdecode_base64がデコードルーチンです。
base64の仕組み

base64というのは、ASCII、バイナリ関係なくUS-ASCIIコードに変換します。
つまりバイナリデータを全て文字で表現します。
もうちっと詳しく言うと「3バイトのデータを4バイトの連続したUS-ASCIIに変換」します。

下表はUS-ASCII文字テーブルです。
左の数値をエンコードしたのが右の文字になります。
数値文字数値文字数値文字
0A22W44s
1B23X45t
2C24Y46u
3D25Z47v
4E26a48w
5F27b49x
6G28c50y
7H29d51z
8I30e520
9J31f531
10K32g542
11L33h553
12M34i564
13N35j575
14O36k586
15P37l597
16Q38m608
17R39n619
18S40o62+
19T41p63/
20U42q
21V43r


では簡単な例を使って、base64エンコードしてみます。
シフトJISコード「たろ」をエンコードします。

0x82 0xBD 0x82 0xEB
10000010 10111101 10000010 11101011

文字、16進、2進での表記です。
これを1バイトづつ上位6ビットに区切り、余りの2ビットは次のデータの上位に繋げます。
最後に余ったビットは下位ビットを0で埋めます。
最後にその数値データを上表のテーブルに基づいてUS-ASCIIに変換します。

0x82 0xBD 0x82 0xEB
10000010 10111101 10000010 11101011
100000 101011 110110 000010 111010 110000
0x20 0x2B 0x36 0x02 0x3A 0x30
32 43 54 2 58 48
g r 2 C 6 w
gr2C6w==


最終的にエンコードされたデータは4の倍数でなくてはなりません。
足りない場合は青字にしてある"="を使い補正します。


ちなみに大きなデータの場合、76文字ごとに改行コード( CR + LF )を入れなくてはいけません。
これを忘れずに!
終わり

base64エンコーダの方法、如何でしたでしょう?
つまらなかった?
まぁそんな事言うな(偉そう)

サンプルは下から落とせます。
c04.lzh (3.53KB)



[先頭ページへ] [次のページへ]

リンクフリー  Copyright (C) K_Yaguchi