Base 64 简介
Base 64 是一种基于 64 个可打印字符表示二进制数据的表示方法。
由于 2^6 = 64,所以每 6 位为一个单元,对应一个可打印字符串。4 个可打印字符(Base 64 单元)则对应 3 字节(24bit = 8 byte)。
它可以用来传输电子邮件中非 ASCII 码的字符(早期设计目的)。
但其有着更重要的意义:
- 所有的二进制文件,都可以因此转化为可打印的文本编码,使用文本软件进行编辑
- 能够对文本进行简单的加密
Base 64 常用于一些处理文本数据的场合,如表示、存储、传输一些二进制数据。(MIME 的电子邮件以及 XML 的一些复杂数据等)
Base 64 转换规则
以 6 位为一个单元,那么显然其包括 64 个字符(大写字母 A-Z,小写字母 a-z,数字 0-9,加号 +,斜杠 / )。
传输的字节数不一定是3的倍数,可能最后需要作为后缀的还有一个等号 = 字符。
转换为 Base 64 后的数据比原始数据略长(大约是原来的 4/3 倍)。
具体规则如下:
- 每 3 个字节(Byte)作为一组,一共 24 个二进制位(bit)。
- 将 24 个二进制位分成 4 组,每组有 6 个二进制位。
- 每组前面加 2 个 0x00 ( 8 bit ),扩展为 32 个二进制,即 4 个字节。
- 按照以下表格,转为对应的符号,这就是 Base 64 的编码值。
/* 0 - 7: 000000 - 000111 */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
/* 8 - 15: 001000 - 001111 */ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
/* 16 - 23: 010000 - 010111 */ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
/* 24 - 31: 011000 - 011111 */ 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
/* 32 - 39: 100000 - 100111 */ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
/* 40 - 47: 101000 - 101111 */ 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
/* 48 - 55: 110000 - 110111 */ 'w', 'x', 'y', 'z', '0', '1', '2', '3',
/* 56 - 63: 111000 - 111111 */ '4', '5', '6', '7', '8', '9', '+', '/'
举例说明,以文本 Man 说明:
文本 | M | a | n |
---|---|---|---|
ASCII 编码 | 77 | 97 | 110 |
文本 | 0 | 7 | 0 | 7 | 0 | 7 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
二进制位 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Base 64 | 0 | 5 | 0 | 5 | 0 | 5 | 0 | 5 |
Base 64 值 | 19(010011) | 22(010110) | 5(000101) | 46(101110) |
---|---|---|---|---|
Base 64 编码 | T | W | F | u |
传输 Base 64 值 | 19(00010011) | 22(00010110) | 5(00000101) | 46(00101110) |
传出的末尾可能会多出 1 个或 2 个字节的数据(3个字节才能对应 4 个 Base 64 单元)。
需要用以下方式处理。
文本(1 Byte) | A(01000001) | 补充的部分(00000000) | 补充的部分(00000000) | |
---|---|---|---|---|
Base 64 编码 | Q(010000) | Q(010000) | = (000000) | = (000000) |
文本(1 Byte) | B(01000010) | C(01000011) | 补充的部分(00000000) | |
---|---|---|---|---|
Base 64 编码 | Q(010000) | k(100100) | M(001100) | = (000000) |
末尾的 000000 采用 = 符号
用于 URL 的改进 Base 64 编码
URL 传输对于 =,+,/ 字符都有其特殊的用意(用于 URL 编解码和数据库存储时),使用标准 Base 64 现在回带来转换的麻烦。
针对 URL 的改进 Base 64 编码则是不在末尾填充 = 号,且把 + 号改成 -,/ 号改成 _。
用于正则表达式的改进 Base 64 变种
+ 改为 ! (在正则表达式有特殊含义)
/ 改为 - (在正则表达式有特殊含义)
还有 *+/ * 改为 _- 或 ._ (用作编程语言中的标识符名称)或 .- (用于 XML 中的Nmtoken)或 _:(用于 XML 中的Name)
网友评论