| たまには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文字テーブルです。
左の数値をエンコードしたのが右の文字になります。
| 数値 | 文字 | 数値 | 文字 | 数値 | 文字 |
| 0 | A | 22 | W | 44 | s |
| 1 | B | 23 | X | 45 | t |
| 2 | C | 24 | Y | 46 | u |
| 3 | D | 25 | Z | 47 | v |
| 4 | E | 26 | a | 48 | w |
| 5 | F | 27 | b | 49 | x |
| 6 | G | 28 | c | 50 | y |
| 7 | H | 29 | d | 51 | z |
| 8 | I | 30 | e | 52 | 0 |
| 9 | J | 31 | f | 53 | 1 |
| 10 | K | 32 | g | 54 | 2 |
| 11 | L | 33 | h | 55 | 3 |
| 12 | M | 34 | i | 56 | 4 |
| 13 | N | 35 | j | 57 | 5 |
| 14 | O | 36 | k | 58 | 6 |
| 15 | P | 37 | l | 59 | 7 |
| 16 | Q | 38 | m | 60 | 8 |
| 17 | R | 39 | n | 61 | 9 |
| 18 | S | 40 | o | 62 | + |
| 19 | T | 41 | p | 63 | / |
| 20 | U | 42 | q | | |
| 21 | V | 43 | r | | |
では簡単な例を使って、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)
|