Base64编码

64次阅读

共计 1244 个字符,预计需要花费 4 分钟才能阅读完成。

Base64 编码

1、三个重要概念

  • 三个字节由四个字节表示的过程
  • Base64 码表
  • 补位

2、如何用三个字节表示四个字节

一个字节由 8 位二进制组成,三个字节总共 28 位,28 ÷ 4 = 6 , 所以转换后有效的二进制位数为 6 位。计算机以 8 位二机制为基础,所以剩下的两位在高位填充 0。由此引申出两个重要的概念

  • 为什么是 64 位
  • 对照表

6 位二进制,$2^6$ = 64 所以只能是 64, 当然如果愿意浪费空间也可以是 32 16 等等。对应的这些二进制怎么表示,所以定义了一个 0 -63 的码表, 分别有 A-Za-z0-9+/ 刚好 64 个字符

索引字符 索引字符 索引字符 索引字符 索引字符 索引字符
0A 1B 2C 3D 4E 5F
6G 7H 8I 9J 10K 11L
12M 13N 14O 15P 16Q 17R
18S 19T 20U 21V 22W 23X
24Y 25Z 26a 27b 28c 29d
30e 31f 32g 33h 34i 35j
36k 37l 38m 39n 40o 41p
42q 43r 44s 45t 46u 47v
48w 49x 50y 51z 520 531
542 553 564 575 586 597
618 629 63+ 64/

author herbert QQ: 464884492

3、手工编码

3.1 刚好转换成 4 个二进制

根据规则使用三个字节转四个字节表示,现在就拿 123 做实例说明,通过查询 ASCII 表得知 123 的二进制分别是 0x31(0011 0001)、0x32(0011 0010)、0x33(0011 0011), 根据规则得到 4 个 6 位二进制分别是 (0011 00) (01 0011) (0010 00) (11 0011), 然后依次在高位补 0 即,右移 2 为,得到 4 个 8 位二进制 (00 0011 00) (00 01 0011) (00 0010 00) (00 11 0011), 通过进制转换得到 4 个十进制数字,分别是(12)(19)(8)(51)。通过查询上边码表中对应的索引的四个 字符分别是(M)(T)(I)(z), 所以 123 对应的 base64 编码为 MTIz

3.2 转换后还剩下 4 位二进制

以 12 来说,字节长度为 16,根据规则转换后会剩下 4 个二进制位 (0011 00) (01 0011) (0010) , 分配好以后,分别在高位补两个 0 (00 0011 00) (00 01 0011) (00 0010 ), 但最后一个字节,位数不够 8 位,所以在最后一个字节的末尾补上 2 个 0 (00 0011 00) (00 01 0011) (00 0010 00),然后在分别转换成十进制数为(12)(19)(8) 查询索引表得到字符 MTI, 目前字符长度不够 4 位,所以在最后补上 1 个=。由此 12 最终的 base64 编码为 MTI=

3.3 转换后还剩下 2 位二进制

以 1 来说,字节长度为 8,根据规则转换后会剩下 2 个二进制位 (0011 00) (01), 分配好以后,分别在高位补两个 0 (00 0011 00) (00 01 ), 但最后一个字节位数不够 8 位,所以在最后一个字节的末尾补上 4 个 0 (00 0011 00) (00 01 0000), 然后转换成十进制数为(M)(Q), 目前长度不够 4 位,所以在最后补上 2 个= 由此 1 最终的 base64 编码为 MQ==

正文完
 0