Base64前世今生
一、背景
早期的一些传输协议,例如传输邮件的SMTP协议,只能传输可打印的ASCII字符(ASCII码的范围是0~127)。导致原本8Bit字节码(范围是0~255)超出了可用范围。
例如:当邮件传输图片资源的时候,某一个Byte是10111100B,对应的十进制数是188,不在ASCII码的范围内,因此无法被传输。此时,Base64编码应运而生,它利用6bit字符表示了原本的8bit字符,可以把ASCII码范围之外的字符转换成可打印的6bit字符。
二、Base64编码
2.1、名称由来
Base64 是一种编码算法,为什么叫Base64呢?因为它只支持64个可打印字符,Base64编码表如下图所示;
2.2、为什么是64?
ASCII码的范围是0~127,其中0~31和127这33 个字符属于控制字符,剩下的95个字符属于可打印字符,包含数组、字母大小写、常用符号。
64是2的6次方,n个二进制数被6位6位的等分。
如果选择7等分:2^7=128,没有那么多的可打印字符;如果选择5等分:2^=32,这样的话会有很多字符资源未使用,浪费资源。
2.3、原理
Base64是如何编码与解码的呢?
编码:
1)把:待转换的数据每三个字节分为一组,每个字节是8bit,那么3个字节一共就是24bit
2)将得到的24bit再每6bit一组,一共得到4组数据
3)在每组前加00,得到4个8bit数据
4)根据Base64编码表获得数据
问题1:如果待转换的数据不是3的整数倍怎么办?
答:多于的8bit中,前6bit作为一个Base64字符,剩下的2bit最为第二个Base64字符的前两位,后0补齐即可。至于第三第四个Base64字符,没有匹配的8bit字符,那么就使用"="字符填充。如下图所示:
发现:Base64字符表中的字符原本用6个bit就可以表示,现在前面添加2个0,变为8个bit,会造成一定的空间浪费。因此,Base64编码之后的文本,要比原数据长大约三分之一。
解码:
解码也是同样的道理。
补充:Base64只是编码算法,并不是加密算法,任何人都可以将Base64编码的结果解码成唯一的原数据。