Base64 实用指南:位分组、填充与校验

从字节和六位分组理解 Base64,计算输出长度,区分规范编码、可兼容格式与不可恢复的错误。

Base64 用一组有限的文本字符表示原始字节,适合只能传输文本的场景。它可以还原任意字节,包括零字节和无法作为文本显示的内容。把字节解释成文字、图片或 PDF,是解码之后的另一个步骤。

三个字节变成四个字符

一个字节有八位,三个字节共 24 位,正好分成四组,每组六位。每组数值对应 64 字符字母表中的一个字符。标准字母表包含大小写字母、数字、加号和斜杠。例如 ASCII 文本 Man 的十六进制字节是 4d 61 6e,结果为 TWFu。

原始字节:01001101 01100001 01101110
六位分组:010011 010110 000101 101110
对应索引:19     22     5      46
编码结果:T      W      F      u

等号说明最后一组的长度

剩一个字节时,输出两个字母表字符和两个等号;剩两个字节时,输出三个字符和一个等号。因此 M 编码为 TQ==,Ma 编码为 TWE=。等号不会保存被截断的内容,随意补齐等号不能找回丢失的有效字符。最后一个字符中未使用的位也必须为零,才是规范编码。

输入 n 个字节时,带填充的输出长度为 4 × ceil(n / 3)。一个 1,024 字节的文件会产生 1,368 个字符,还没有计算 Data URI 前缀或换行。Base64 本身不压缩数据,传输层压缩属于另外的处理。

先校验编码,再解释内容

检查程序是否遵守协议时选择严格模式;处理已知来源的换行、缺失填充或 Data URI 时可以使用兼容模式,并查看调整记录。未知标点、混合字母表和非零填充位应该调查原因,不能直接删除。

合法 Base64 也可能解码出非法 UTF-8、损坏图片或不完整 PDF。成功解码只证明编码层成立。二进制应按字节下载,再用对应格式的解析器检查。规范见 RFC 4648。