base64编码
Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation.
Base64是一种用64个可打印字符来表示任意二进制数据的方法,不能用于加密。
为什么使用Base64格式编码?
在只支持纯文本的协议中需要保存非字符类数据(url(data:image/png;base64,iVBORw0KGgo…;)),或在只支持ASCII字符的系统中保存非ASCII字符的数据时,可以将数据的二进制形式编码成Base64形式保存。
ASCII码的128~255之间的值是不可见字符,在纯文本协议的传输过程中可能会被错误当作控制字符处理引起传输失败。全部编码成可见字符,降低出错的可能性。
Base64的编码转换方式
- 将每三个字节分为一组,一共是24 bit。
- 将这24个二进制位分为四组,每个组有6个二进制位。
- 在每组前面固定先加00,这样每组还是8 bit,有效位是每组的低6位。即原来3个字节扩展成32个二进制位四字节。(每组最高值为63)
- 然后查表得到编码后的字符串。Base64将三个字节转化成四个字节,编码后的文本会比原文多三分之一。
Base64编码表
码值 |
字符 |
|
|
码值 |
字符 |
|
码值 |
字符 |
|
码值 |
字符 |
0 |
A |
|
26 |
a |
52 |
0 |
62 |
+ |
|||
… |
… |
|
… |
… |
… |
… |
63 |
/ |
编码实例:
source ASCII (if <128) | M | a | n | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
source octets | 77 (0x4d) | 97 (0x61) | 110 (0x6e) | |||||||||||||||||||||
Bit pattern | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Index | 19 | 22 | 5 | 46 | ||||||||||||||||||||
Base64-encoded | T | W | F | u | ||||||||||||||||||||
Unicode Point | 84 (0x54) | 87 (0x57) | 70 (0x46) | 117 (0x75) |
str.charCodeAt() 方法可返回指定位置的字符的 Unicode 编码,返回值是 0 - 65535 之间的整数。String.fromCharCode(code)方法将编码转为对应的字符。
如果要编码的二进制数据不是3的倍数,分组后后会剩下1个或2个字节。Base64用\x00在末尾补足一组后,再在编码的末尾加上1个或2个=号,表示为了凑成一组补了多少字节。
多一个字节时:先在该字节之后添加2个\x00字节组成一组,再按照上面的规则转换成base64码的4字节。每个字节前面2位固定为0,最后在Base64编码的末尾补上两个"="号,表示补了2个字节。
比如,"M"这个字母是一个字节,可以转化为二组00010011、00010000,对应的Base64值分别为T、Q,再补上二个"="号,因此"M"的Base64编码就是TQ==。
Text content | M | 添加\x00补足一组 | 添加\x00补足一组 | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII | 77 (0x4d) | 0 (0x00) | 0 (0x00) | |||||||||||||||||||||
Bit pattern | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Index | 19 | 16 | 0 | 0 | ||||||||||||||||||||
Base64-encoded | T | Q | = | = |
多二个字节时:先在这两个字节之后添加1个\x00组成一组,再按照上面的规则转换成base64的4字节,最后在末尾补上一个"="号。
比如,"Ma"这个字符串是两个字节,可以转化成三组00010011、00010110、00000100以后,对应Base64值分别为T、W、E,再补上一个"="号,因此"Ma"的Base64编码就是TWE=。
Text content | M | a | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII | 77 (0x4d) | 97 (0x61) | 0 (0x00) | |||||||||||||||||||||
Bit pattern | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Index | 19 | 22 | 4 | 0 | ||||||||||||||||||||
Base64-encoded | T | W | E | = |
中文用Base64编码
先要获得二进制数据,再根据上述规则转换。不同的中文编码方式对应的二进制不同,所有如果不统一容易出现乱码。
"严"的utf-8编码为3字节E4B8A5,写成二进制就是三字节的"11100100 10111000 10100101",然后转换成Base64值就是5Lil。