インターネットが情報のハイウェイである場合、電子メールの経路は狭い渓谷です。非常に小さなカートだけが通ることができます。
電子メールの転送システムは、単純な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 | / |