base64 介绍
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于 2^6=64
,所以每6个比特为一个单元,对应某个可打印字符。3个字节相当于24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。在Base64中的可打印字符包括字母A-Z
、a-z
、数字0-9
,这样共有62
个字符,此外两个可打印符号在不同的系统中而不同。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。
为什么要base64
ASCII码一共规定了128个字符的编码,这128个符号,范围在[0,127]之间。
其中 [0,31] 和 127 这33个属于不可打印的控制字符。
在电子邮件传输信息时,有些邮件网关会把[0,31]这些控制字符给悄悄清除。还有的早期程序收到[128,255]之间的国际字符时,甚至会发生错误。
如何在不同邮件网关之间安全的传输控制字符,国际字符,甚至二进制文件?
于是作为MIME多媒体电子邮件标准的一部分 base64
被开发出来。
base64怎么工作的?
字符串 Hello world
在经过base64 编码之后变成 SGVsbG8gV29ybGQ=
。
编码"Hel" 的结果为 SGVs
, 详细原理如下:

Base64索引表

如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:
先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。
在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。也就是说,当最后剩余两个八位(待补足)字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;
如果最后剩余一个八位(待补足)字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。
参考下表:

什么是url_safe base64编码?
标准的Base64
并不适合直接放在URL
里传输,因为URL
编码器会把标准Base64
中的/
和+
字符变为形如%XX
的形式,而这些%
号在存入数据库时还需要再进行转换,因为ANSI SQL
中已将%
号用作通配符。
为解决此问题,可采用一种用于UR
L的改进Base64
编码(url_safe_base64
),它将标准Base64
中的+
和/
分别改成了-
和_
,这样就免去了在URL编解码和数据库存储时所要做的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。