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;