← 返回博客

Base64 编码原理完全图解

2026-04-15 · 5 分钟阅读

← 返回博客

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)。

立即尝试在线工具,无需安装,免费使用。

打开工具 →

立即免费使用相关工具

免费使用 →