第四章

Base64 解码原理

编码的逆过程:从 4 个字符还原 3 个字节

4.1 解码过程详解

解码完全是编码的逆运算。我们需要将 4 个 6 位的 Base64 字符重新组合成 3 个 8 位的原始字节。

步骤 1:字符转索引

字符
Q
U
J
D
十进制
16
20
9
3

步骤 2:转 6 位二进制

010000 010100 001001 000011

步骤 3 & 4:合并并按 8 位重组

合并 (24位): 010000010100001001000011

重组为字节:

01000001 (65) -> A

01000010 (66) -> B

01000011 (67) -> C

4.2 处理填充字符

在解码时,填充字符 = 告诉我们原始数据的结束位置,以及应该丢弃多少冗余位。

  • =:完整解码出 3 个字节。
  • 1 个 =:说明原数据剩 2 字节。解码 3 个字节后,丢弃最后一个字节(其实是全是 0 的填充位)。事实上,我们只需要前 16 位有效数据。
  • 2 个 =:说明原数据剩 1 字节。我们只需要前 8 位有效数据。

4.3 位运算的解码实现

假设我们解析出了 4 个索引值 c1, c2, c3, c4

// 1. 还原第一个字节:c1 移位 + c2 的高位
byte1 = (c1 << 2) | (c2 >> 4);

// 2. 还原第二个字节:c2 的低位 + c3 的高位
byte2 = ((c2 & 0x0F) << 4) | (c3 >> 2);

// 3. 还原第三个字节:c3 的低位 + c4
byte3 = ((c3 & 0x03) << 6) | c4;