Base64エンコーディングのしくみ

インターネットが情報のハイウェイである場合、電子メールの経路は狭い渓谷です。 非常に小さなカートだけが通ることができます。

電子メールの転送システムは、単純なASCIIテキスト用に設計されています。 他の言語や任意のファイルでテキストを送信しようとするのは、トラックを渓谷に通すようなものです。

ビッグトラックは渓谷をどのように通過するのですか?

それでは、小さな渓谷に大きなトラックをどのように送りますか? あなたは片方の端に小片を持って行き、小片を渓谷に運び、反対側の小片からトラックを再建しなければなりません。

電子メールで添付ファイルを送信する場合も同じことが起こります 。 エンコーディングとして知られているプロセスでは、バイナリデータはASCIIテキストに変換され、問題なく電子メールで転送されます。 受信者側では、データがデコードされ元のファイルが再構築されます。

任意のデータをプレーンなASCIIテキストとしてエンコードする1つの方法は、Base64です。 これは、 プレーンテキスト以外のデータを送信するためにMIME標準で採用されている手法の1つです

レスキューへのBase64

Base64エンコーディングは、それぞれが8ビットからなる3バイトをとり、ASCII標準で4つの印字可能文字として表します。 それは本質的に2つのステップで行います。

最初のステップは、3バイトを4つの6ビット数に変換することです。 ASCII標準の各文字は7ビットで構成されています。 Base64は6ビット(2 ^ 6 = 64文字に対応)を使用して、エンコードされたデータが印刷可能で人間が読めるようにします。 ASCIIで使用可能な特殊文字は使用されません。

64文字(したがってBase64という名前)は、10桁、26個の小文字、26個の大文字、 '+'と '/'です。

例えば、3バイトが155,162および233である場合、対応する(および恐ろしい)ビットストリームは100110111010001011101001であり、これは6ビット値38,58,11および41に対応する。

これらの数値は、Base64エンコーディングテーブルを使用して2番目の手順でASCII文字に変換されます。 この例の6ビットの値は、ASCIIシーケンス "m6Lp"に変換されます。

この2つのステップのプロセスは、エンコードされたバイトシーケンス全体に適用されます。 エンコードされたデータが正しく印刷され、メールサーバーの行長制限を超えないように、行の長さを76文字以下に保つために改行文字が挿入されます。 改行文字は他のすべてのデータと同様にエンコードされます。

エンドゲームを解決する

エンコード処理の最後に、問題が発生する可能性があります。 バイト単位の元のデータのサイズが3の倍数であれば、すべて正常に動作します。 そうでない場合は、1つまたは2つの8ビットバイトで終わる可能性があります。 適切なエンコーディングのためには、正確に3バイト必要です。

解決方法は、3バイトのグループを作成するのに十分なバイトに「0」の値を追加することです。 1つの余分なバイトのデータがある場合、そのような2つの値が追加されます.1つは追加の2つのバイトに追加されます。

もちろん、これらの人工の末尾の '0'は、以下のエンコードテーブルを使用してエンコードすることはできません。 それらは65番目の文字で表されなければなりません。

Base64のパディング文字は '='です。 当然のことながら、それは符号化されたデータの最後にしか現れません。

Base64エンコーディングテーブル

チャー チャー チャー チャー
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 バツ
2 C 18 S 34 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 バツ 39 n 55 3
8 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 あなた 62 +
15 P 31 f 47 v 63 /