base64 作用
二进制数据,每个字符取值范围 [0, 255]
,作为 ascii 码解析时,只有部分可显示 (打印)
肉眼查看 / 作为文本拷贝这份数据,16 进制优于二进制 ascii 码格式
但 16 进制表示法需两个字节才能表示表示原始数据的一个字节,即大小增加了一倍
base64 算法保持编码后可打印特性的同时,大小只增加 1/3
算法原理

将二进制数据每三个字节(24 位)看成一个单元,按每 6 位进行一次切割,切割成 4 个字节。切割后每个字节的范围是 [0, 63]
[0, 63]
的 ascii 码也并不都是可打印的,将 [0, 63]
再映射成可打印的字符
RFC 4648 映射关系定义:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
0 对应 A,1 对应 B,63 对应 /
换算之后,三个字节变成可打印的四个字节内容
解码逻辑,将每个可打印的字符按映射表对应,每 4 个字节看成一个单位,按位运算还原出原始 3 个字节
原始数据长度不是 3 的倍数?
一种是最后剩 1 个字节,另一种是剩两个字节:
- 剩余 1 个字节时,1 个字节编码成 2 个字节,剩余 2 个字节填充为 ==
- 剩余 2 个字节时,2 个字节编码成 3 个字节,剩余 1 个字节填充为 =
即 base64 保证了编码后的字符串长度为 4 的倍数
作为 url 参数问题
base64 编码后可能会出现 +/= 三个字符,会影响到整个 url 串的解析
例,https://example.com/all?key=1/2=
RFC 4648 中给出另一张映射表, + 替换成 -,/ 替换成 _
Preview: