base64
发布于
Top
coding

base64的作用

二进制数据,每个字符取值范围[0, 255],作为ascii码解析时,只有部分可显示(打印)

肉眼查看/作为文本拷贝这份数据,16进制优于二进制ascii码格式

但16进制表示法需两个字节才能表示表示原始数据的一个字节,即大小增加了一倍

base64算法保持编码后可打印特性的同时,大小只增加 1/3

base64算法原理

将二进制数据每三个字节(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 中给出另一张映射表, + 替换成 -,/ 替换成 _