インターネットが情報のハイウェイである場合、電子メールの経路は狭い渓谷です。 非常に小さなカートだけが通ることができます。
電子メールの転送システムは、単純な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"に変換されます。
- 155 - > 10011011
- 162 - > 10100010
- 233 - > 11101001
- 100110 - > 38
- 111010 - > 58
- 001011 - > 11
- 101001 - > 41
- 38 - > m
- 58 - > 6
- 11→L
- 41 - > p
この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 | / |