Base64是一种用64个可打印字符来表示任意二进制数据的方法。
base64编解码就是将二进制数据和64中可打印字符的相互转化。
转化原理
1,将二进制数据每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
2,将上面的24个二进制位每6个一组,共分为4组。
3,在每组前添加2个0,每组由6个变为8个二进制位,总共32个二进制位,也就是四个字节。
4,根据base64编码对照表将每个字节转化成对应的可打印字符
转化实例如下图
问题:
1,为什么每6位分为一组?
因为6个二进制位就是2的6次方,也就是64种变化,正好对应64个可打印字符。
举一反三,如果是5位一组,那就对应32种可打印字符,就可以设计base32了。
2,分成四组后为什么每组添2个0变成四个字节?
因为计算机存储的最小单位就是字节,也就是8位。所以每组6位前添2个0凑成8位的一个字节才能存储。
标准的base64编码对照表如下。
标准base64的64个可打印字符由52个大小写英文字母和10个数字(0-9)以及 / 和 + 组成。
base64是将二进制每三个字节转为4个字节,再根据base64编码对照表进行转化。那如果不足三个字节该如何?
对于标准base64是按如下处理的:
两个字节:两个字节共16个二进制位,依旧按照规则进行分组。此时总共16个二进制位,每6个一组,则第三组缺少2位,用0补齐,得到三个Base64编码,第四组完全没有数据则用“=”补上。
因此,如下图中“BC”转换之后为“QKM=”;
一个字节:一个字节共8个二进制位,依旧按照规则进行分组。此时共8个二进制位,每6个一组,则第二组缺少4位,用0补齐,得到两个Base64编码,而后面两组没有对应数据,都用“=”补上。
因此,如下图中“A”转换之后为“QQ==”
由于标准base64的64个可打印字符由52个大小写英文字母和10个数字(0-9)以及 / 和 + 组成。而对于不足字节有需要用 = 来补齐字节。
所以经过标准base64编码后,就有可能包含+ / = 这三种字符。
而在URL编码中这三种字符要么需要编码成%XX的形式,要么具有特殊意义。
所以标准的base64一般不用于对URL进行编码。
所以有些非标准的base64编码会把字符 +
和 /
分别变成 -
和 _ 或者其他字符,并且不会用 = 进行补位。
这样就可以对URL进行编码或者用于其它用途的编码