为什么会有Base64编码呢?
早期的邮件只能处理文本格式的内容,而且是英文格式的内容,为了能在邮件中使用其他语言,同时可以支持传输图片、音频、视频等多媒体内容,人们设计扩展了邮件传输协议,使得它能支持一种叫做MIME(Multipurpose Internet Mail Extentions,多媒体邮件扩展标准)标准。
在MIME中,为了能够使用文本协议传输这部分内容,就需要对传输的对象进行转码。如果不进行转码,这部分数据是无法直接在邮件传输的。一个很重要的原因是邮件传输协议使用.符号作为正文的结束符,直接传输二进制的数据会导致可能出现误判,就无法获取到完整的邮件内容。
MIME中最常用的转码方式有两种,对于含有大量7BIT字符的数据多采用Quoted-Printable编码,对于二进制的数据多使用Base64编码。
Base64编码的原理是怎样的?
Base64编码就是把二进制的数据通过一个映射关系,全部转换为64个预定义的字符,这64个字符中不包含控制符,所以能够被邮件等正确的传输识别。
这64个字符的码表索引定义如下图所示:
那二进制的数据是怎样转变成上述的码表中的字符呢?
通常,计算机中传输数据都是以字节(一般为8bit)为单位,我们需要对要进行转码的数据以每3个字节分组,也就是24bit一组,将这24bit拆分成4份,每份6bit,每6bit组成一个新的字节(前两位不足的补足为0),这样就能得到n组4字节的数据。
由于拆分后的每个字节实际只有6位有实意,也就是最大只能表示64,于是就可以通过以上的码表转换成对应的字符,然后们就可以通过转换后的字符进行传输了。
到这里可能有的同学会问,上面直接拆分成4字节后直接传输不可以吗?为什么还要再进行码表转换呢?这是由于虽然拆分成了4字节,但是其数据还是包含控制字符,例如39也就是ascii字符中的.号,这个是邮件传输协议中的正文结束符,所以还是不满足要求,只要转换成上面码表中的字符后,才能被正确的识别。
同时,还有同学会问,我们要传输的数据可能并不是3的整数倍,这时候要怎么办呢?对于不是3的整数倍的数据,我们先填充空字符,也就是二进制为 00000000,记录下差几个字符,按上述方法转换完成后,将最后差的字符替换为=号,比如差1个字符,就将最后一位替换为=,差两位就将最后两位替换为==。当然