Base64 编码原理完全图解
← 返回博客
Base64 编码原理完全图解
· 5 分钟阅读
从字节到比特:基础知识回顾
要理解 Base64,首先需要了解计算机如何存储数据。计算机使用二进制(0 和 1)存储所有信息。8 个比特(bit)组成 1 个字节(byte),1 字节可以表示 0–255 之间的值。字符 'A' 的 ASCII 码是 65,对应二进制 01000001;字符 'B' 是 66,对应 01000010;字符 'C' 是 67,对应 01000011。
Base64 的工作原理就是将这些字节的二进制表示重新分组——不是每 8 位一组,而是每 6 位一组——然后将每个 6 位组映射为一个可打印字符。这种重新分组是 Base64 的核心操作。
完整编码示例:字符串 "ABC"
Step 1: 获取 ASCII 值 / Get ASCII values
A = 65, B = 66, C = 67
Step 2: 转换为 8 位二进制 / Convert to 8-bit binary
A = 01000001
B = 01000010
C = 01000011
Step 3: 连接所有比特 / Concatenate all bits
010000 010100 001001 000011
↑ ↑ ↑ ↑
16 20 9 3 ← 6位十进制值 / 6-bit decimal values
Step 4: 查 Base64 字母表 / Look up Base64 alphabet
16 = Q
20 = U
9 = J
3 = D
Step 5: 输出结果 / Output
"ABC" → "QUJD"
注意:3 个输入字节(24位)恰好产生 4 个输出字符(4×6=24位),没有任何信息丢失或添加,只是改变了分组方式。
Base64 字母表(索引表)
Index Char Index Char Index Char Index Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /
(pad) =
处理不足3字节的情况
示例:只有 1 个字节 "M" (77 = 01001101)
Example: Just 1 byte "M" (77 = 01001101)
二进制:01001101
分为 6+2 位:010011 | 01xxxx (不足6位补0)
→ 010011 = 19 → 'T'
→ 010000 = 16 → 'Q'
填充两个等号 / Add two padding chars
结果 / Result: "TQ=="
示例:只有 2 个字节 "Ma" (77, 97 = 01001101 01100001)
Example: Just 2 bytes "Ma" (77, 97)
二进制:01001101 01100001
分为 6+6+4 位:010011 | 010110 | 0001xx
→ 010011 = 19 → 'T'
→ 010110 = 22 → 'W'
→ 000100 = 4 → 'E'
填充一个等号 / Add one padding char
结果 / Result: "TWE="
解码过程(逆向操作)
解码是编码的精确逆操作。给定 Base64 字符串,按以下步骤还原:(1)去除填充字符(=),记录填充数量;(2)将每个 Base64 字符替换为其 6 位索引值;(3)将所有 6 位块连接成一个长比特串;(4)按每 8 位一组分割,还原字节;(5)根据填充数量删除末尾多余的字节(1个=号删除1字节,2个=号删除2字节)。
解码 "QUJD" 的过程 / Decoding "QUJD":
Q=16=010000, U=20=010100, J=9=001001, D=3=000011
连接 / Concatenate: 010000 010100 001001 000011
重组为 8 位 / Regroup to 8-bit: 01000001 01000010 01000011
转换为 ASCII / Convert to ASCII: A(65) B(66) C(67)
结果 / Result: "ABC"
为什么体积增大 33%
体积增大 33% 的数学原因很直观:原始数据每 3 字节(24位)被表示为 4 个字符(每个字符 1 字节,共 4 字节)。4/3 ≈ 1.333,即增大约 33%。MIME 格式的 Base64(每 76 字符一行)还会额外增加约 1.5% 的换行开销。
这是 Base64 编码效率的内在代价。如果需要更高效的二进制到文本编码,可以考虑 Base85(Ascii85),它使用 85 个字符将 4 字节表示为 5 个字符,体积开销约 25%。但 Base85 的字符集较复杂,兼容性不如 Base64 广泛。
Base64 编码的计算复杂度
Base64 的时间复杂度为 O(n),其中 n 是输入数据的字节数。编码过程只需简单的位操作和数组查表,不需要任何复杂的计算。在现代硬件上,Base64 编码速度非常快,通常可以达到数 GB/秒的吞吐量(使用 SIMD 指令优化的实现)。
空间复杂度也是 O(n),输出大小为 ceil(n/3)*4 字节。理解 Base64 的性能特征有助于在系统设计中做出合理的决策,例如是否应该将大型二进制文件转为 Base64 后再存入数据库,还是使用专门的二进制存储(如 BYTEA、BLOB)。
立即尝试在线工具,无需安装,免费使用。
打开工具 →
立即免费使用相关工具
免费使用 →