base64
ddatsh
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 中给出另一张映射表, + 替换成 -,/ 替换成 _