如果文中有错漏,欢迎指正。


Base64 是一种编码方式,用于将 一段二进制序列编码为文本的形式 (binary-to-text encoding)。

编码表

Base64 的编码表是一个包含 64 个字符元素的字符集。通常包含大小写字母和数字,即 A-Za-z0-9,一共为 26 * 2 + 10 = 62 个字符,余下两个字符可以自由发挥。在 RFC-4648 中给出了两种方案:

  • 方案一:标准集合,编码表最后两个字符分别为 +/
  • 方案二:URL 和文件系统中使用的方案,编码表最后两个字符分别为 -_,又称 Base64URL (URL and Filename Safe)。

除了包含 64 个字符的编码表,Base64 编码还规定了使用 = 字符作为填充字符 (padding)。因此编码后的字符串,一共包含最多 65 种字符。

编码过程

以 3-Byte 为一组输入 (共 24-bit),正好拆分为4个基本单元(每个单元为 6-bit)。由于 6-bit 的宽度可表示 2⁶ = 64 个整数,范围为 0-63,正好作为编码表的索引值,因此可表示为字符集中的一个字符。最终每组 3-Byte 输入,均可得到4个字符作为输出。

示例1:对 US-ASCII 字符串 Man 进行 Base64 编码

这三个字符的十六进制和二进制分别为 M - 4d (01001101), a - 61 (01100001), n - 6e (01101110)。将这段二进制序列以 6-bit 为一组,可拆分为 010011, 010110, 000101101110,分别为十进制的 19, 22, 5, 46。以此为字符集的索引值,可得对应的输出字符为 TWFu

示例2:输入字节数不满 3-Byte, 如 a

将输入的字节组从左到右处理:不满足 6-bit 时,在右边填入0使之长度满足 6-bit,然后匹配字符集的索引。如果此时输出仍不满足4字符,则空缺部分使用填充字符 = 表示。

a - 61 (01100001) 从左到右可拆分为 011000, 01 两部分。

  • 第一部分 011000 可按正常处理,查的字符集对应索引值 24 的字符为 Y
  • 第二部分 01 需要在右侧填入 0 使之总长达到 6-bit, 即 010000, 然后对应索引值 16 的字符为 Q
  • 由于此时 YQ 只有两个字符,因此在后方填入 = 使之满足4字符的要求,最终得到 YQ==