如果互联网是信息高速公路,那么电子邮件的路径是一个狭窄的沟壑。 只有很小的车可以通过。
电子邮件的传输系统仅用于纯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 | / |