如果互联网是信息高速公路,那么电子邮件的路径就是狭窄的峡谷。只有非常小的推车才能通过。
电子邮件的传输系统仅用于纯ASCII文本。尝试用其他语言或任意文件发送文本就像在山沟中驾驶卡车一样。
大卡车如何通过山沟?
那么你如何通过一个小山沟发送一辆大卡车?你必须在一端将它收起来,将碎片运送到山沟,然后从另一端的碎片重建卡车。
通过电子邮件发送文件附件时也会发生同样的情况。在称为编码的过程中,二进制数据被转换为ASCII文本,可以在没有问题的情况下通过电子邮件传输。在收件人端,数据被解码并重建原始文件。
将任意数据编码为纯ASCII文本的一种方法是Base64。它是MIME标准用于发送纯文本以外的数据的技术之一。
Base64到救援
Base64编码占用三个字节,每个字节由8位组成,并在ASCII标准中将它们表示为四个可打印字符。它基本上分两步完成。
第一步是将三个字节转换为四个六位数。 ASCII标准中的每个字符由七位组成。 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
- 162 -> 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 | |||
5 | 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 | 5 | |||
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 | Ø | 30 | Ë | 46 | ü | 62 | + | |||
15 | P | 31 | F | 47 | v | 63 | / |