たまには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)
|