序言
在说Base64之前,我们应当知道位与字节的含义:
- 位(bit): 计算机中数据的最小单位, 也就是平常看到的‘0’ 和 ‘1’这样的东西, 每个‘0’或‘1’代表一位。
- 字节(Byte): 计算机中数据的基本单位,每8位组成一个字节。 即 1B =8b
为什么要Base64编码
因为在网络传输数据时,有些数据并不是都是可见字符,那些不可见字符(如 空格、换行等等)可能会被处理错误。 像传输图片, 图片我们用文本编辑器打开的话是乱码的,因为包含了不可见的字符。 直接传输的话,那些不可见的字符传输就有问题,所以Base64编码解决的就是 把不可见的字符全部编码为可见的字符,这样传输被处理错误的可能性大大降低。
Base64编码原理
Base64是一种基于64个可打印的字符来表示二进制数据的方法。 可打印的64个字符包含A-Z、a-z、0-9、+、/
如下图:
Base64编码原理几个基本步骤
- 每3个字节的ascii码为一组,就有24bit
- 然后分为4组,每组6bit。
- 算出每组二进制转为十进制值
- 然后根据Base64 索引表 (十进制值就代表索引) 来找对应的字符。 得到的就是Base64编码后的字符。
例如 abc
- ascii编码 : 97 、 98 、99
- 二进制 : 01100001 、 01100010 、01100011
- 每6bit分为一组: 011000 、010110 、 001001 、100011
- 索引值: 24 、 22 、 9 、 35
- 根据Base64索引表找到对应的值: Y 、 W 、 J 、j
测试验证:
"abc"经过Base64编码后得到的结果为YWJj , 说明按照这样的计算时没有问题的。
如果待Base64编码的字节数不是3的倍数怎么办。
一个字节时: Base64是每三个字节一组,但是只有一个字节,只有8位,每6位分为一组,多出的2位 不足6位, 就后面补0 凑齐6位, 但是后面还有两个输入数据,不够就用 ‘=’代替。 如上图
测试验证:
两个字节时: Base64是每三个字节一组,但是只有两个字节,只有16位,每6位一组,多出4位,不足
6位,后面补两个0凑齐6位, 但是最后还有一位需要输入,就用‘=’代替。如上图
测试验证:
Base64是以三个字节为一组,所以只有两种情况:要么多一个字节,要么多两个字节。 多一个字节时后面会多两个‘==’,多两个字节时会多一个‘=’。
Base64解码就是编码逆过程,懂编码原理,解码原理逆推即可。
总结:
- Base64编码作用就是把有不可见的字符全部转为可见的字符。以方便网络传输;
- Base64不属于加密,虽然Base64编码后,肉眼很难看出来,但是Base64编码原理很简单,很容易被解析出来。
- 字符在不同的编码下,如UTF-8、GBK等。可能通过Base64编码后得到的结果不同。
- Base64是以三个字节为一组,3*8=24位,然后以6位一组,4组那就是4个字节,所以每三个字节Base64后就会多出一个字节。