如果互聯網是信息高速公路,那麼電子郵件的路徑是一個狹窄的溝壑。 只有很小的車可以通過。
電子郵件的傳輸系統僅用於純ASCII文本。 嘗試以其他語言或任意文件發送文本就像是通過峽谷獲取卡車。
大卡車如何穿過山溝?
那麼你如何通過一個小峽谷發送一輛大卡車? 你必須把它在一端拆下來,把這些碎片運過峽谷,然後從另一端的碎片重建卡車。
當您通過電子郵件發送文件附件時會發生同樣的情況。 在一個被稱為編碼的過程中,二進制數據被轉換為ASCII文本,可以通過電子郵件傳輸而不會出現任何問題。 在收件人的一端,數據被解碼並重建原始文件。
一種將任意數據編碼為純ASCII文本的方法是Base64。 這是MIME標准採用的除純文本以外的其他數據發送技術之一。
Base64到救援
Base64編碼需要三個字節,每個字節由八位組成,並將它們表示為ASCII標準中的四個可打印字符。 它基本上分兩步完成。
第一步是將三個字節轉換為四個六位數。 ASCII標準中的每個字符由7位組成。 Base64僅使用6位(對應於2 ^ 6 = 64個字符)以確保編碼數據可打印並且可以人性化讀取。 沒有使用ASCII中可用的特殊字符。
64個字符(因此名稱為Base64)是10位數字,26個小寫字符,26個大寫字符以及'+'和'/'。
例如,如果三個字節是155,162和233,則對應(和可怕的)比特流是100110111010001011101001,其依次對應於6比特值38,58,11和41。
這些數字在第二步中使用Base64編碼表轉換為ASCII字符。 我們示例的6位值轉換為ASCII序列“m6Lp”。
- 155 - > 10011011
- > - > 10100010
- 233 - > 11101001
- 100110→38
- 111010→58
- 001011 - > 11
- 101001 - > 41
- 38 - > m
- 58 - > 6
- 11 - > L
- 41 - > p
這兩步過程適用於編碼的整個字節序列。 為確保編碼數據可以正確打印並且不超過任何郵件服務器的行長度限制,插入換行符以保持行長度小於76個字符。 換行符與所有其他數據一樣被編碼。
解決終結
在編碼過程結束時,我們可能會遇到問題。 如果原始數據的字節大小是三的倍數,那麼一切正常。 如果不是,我們可能會得到一個或兩個8位字節。 然而,為了正確編碼,我們只需要三個字節。
解決方案是附加足夠的字節值為'0'來創建一個3字節的組。 如果我們有一個額外的數據字節,則附加兩個這樣的值,一個附加兩個額外的字節。
當然,這些仿真結尾的'0'不能使用下面的編碼表進行編碼。 他們必須由第65個字符表示。
Base64填充字符是'='。 當然,它只能出現在編碼數據的末尾。
Base64編碼表
值 | 燒焦 | 值 | 燒焦 | 值 | 燒焦 | 值 | 燒焦 |
---|---|---|---|---|---|---|---|
0 | 一個 | 16 | Q | 32 | G | 48 | w ^ |
1 | 乙 | 17 | [R | 33 | H | 49 | X |
2 | C | 18 | 小號 | 34 | 一世 | 50 | ÿ |
3 | d | 19 | Ť | 35 | Ĵ | 51 | ž |
4 | Ë | 20 | ü | 36 | ķ | 52 | 0 |
五 | F | 21 | V | 37 | 升 | 53 | 1 |
6 | G | 22 | w ^ | 38 | 米 | 54 | 2 |
7 | H | 23 | X | 39 | ñ | 55 | 3 |
8 | 一世 | 24 | ÿ | 40 | Ø | 56 | 4 |
9 | Ĵ | 25 | ž | 41 | p | 57 | 五 |
10 | ķ | 26 | 一個 | 42 | q | 58 | 6 |
11 | 大號 | 27 | b | 43 | [R | 59 | 7 |
12 | 中號 | 28 | C | 44 | 小號 | 60 | 8 |
13 | ñ | 29 | d | 45 | Ť | 61 | 9 |
14 | Ø | 三十 | Ë | 46 | ü | 62 | + |
15 | P | 31 | F | 47 | v | 63 | / |