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 个字节,另一种是剩两个字节:

即 base64 保证了编码后的字符串长度为 4 的倍数

作为 url 参数问题

base64 编码后可能会出现 +/= 三个字符,会影响到整个 url 串的解析

例,https://example.com/all?key=1/2=

RFC 4648 中给出另一张映射表, + 替换成 -,/ 替换成 _