理解 Base64 编码


什么是 Base64?有什么用?

base64 是一种编码算法,它使得 “可打印的字符” 能表示 “二进制数据”。换句话说,就是用字符串来表示二进制文件。

最早,在通过电子邮件收发消息的过程中,人们只发送文本内容。后来,增加了发送二进制文件的需求。base64编码就是在这一个需求的解决过程中诞生的。

现在的web开发中,也经常用base64来编码图片。一些数字证书签名也会用base64存储。

数据库技术中,偶尔也会使用base64编码,将原本使用的UUID数据主键编码为更短的字符串。

Base64 的编码过程

首先,取64种可打印的字符,依次编号。假设用数组 a 存储这64个可打印字符,数组下标就是他们对应的编号。

a = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/']

然后,对要编码的二进制数据,每次取6个比特。我们知道6位二进制所代表的数字范围是 0 ~ 63。用变量名 i 表示这6个比特所代码的数字。a[i] 的值就是这6个比特对应的base64编码结果。

最后,规定24个比特(即3个字节)为一组,每组会产生4个可打印字符。如果最后一组的数据不足24个比特,用 = 补齐。

思考:为什么是64,而不是其他数字?

从上面编码的过程中可以看出:原本3个字节的数据,编码后需要用4个字节来表示(中间补了很多0),编码效率大约是75%。

假设存在 base16 编码,同样的原理,编码效率会只剩下50%。所以低于64的数字一般是不考虑的。

假设存在 base256 编码,效率能达到100%,问题在于 “可打印” 的字符,并没有256种那么多。