Base64 的 = 补位:为什么结尾会有一两个等号
Base64 以 3 字节为一组编码成 4 字符,输入不足 3 的倍数时用 = 补齐。讲清补位原理、解码行为与 URL Safe 变体的差异。
一、3 对 4 的数学关系
Base64 字符表 64 个字符 = 6 bit 信息量;原始数据按字节算 8 bit。最小公倍数 24 bit = 3 字节 ↔ 4 字符。编码器每吃 3 个字节输出 4 个字符,严丝合缝。
二、补位的两种情况
输入长度不是 3 的倍数时:
- 剩 1 字节(8 bit):补 4 个 0 凑 12 bit,编成 2 个字符,再补 2 个 =。如
a→YQ== - 剩 2 字节(16 bit):补 2 个 0 凑 18 bit,编成 3 个字符,再补 1 个 =。如
ab→YWI=
所以 Base64 结果长度永远是 4 的倍数,= 只出现在结尾,最多两个。
三、解码端的行为
- = 不携带数据,解码时直接丢弃,按实际 bit 数还原字节数。
- 大多数库对缺失或多余 = 宽容处理,但严格解析器(部分 JWT 实现)会报错——拼 URL、对接接口时别手工裁剪 =。
- = 可以唯一位数反推原始长度,具有一定的「长度泄露」性质,但内容本身仍不保密。
四、URL Safe 变体
标准 Base64 里的 +/= 在 URL、文件名里是特殊字符,于是有 URL Safe Base64:
+→-,/→_=通常直接省略(解码端按长度补回)
JWT、数据库主键短 ID(如 YouTube 视频 ID 风格)都用这套变体。两套字母表不通用,解码前要确认变体,否则报错或解出乱数据。
在线体验
不用装任何环境,直接用本站Base64 编解码工具在线操作,数据都在浏览器本地处理,方便又安全。
常见问题
Base64 结果一定以 = 结尾吗?
不一定。输入长度恰是 3 的倍数时没有 =。是否出现 = 以及出现几个,只取决于输入长度 mod 3。
JWT 里为什么看不到 = ?
JWT 采用 URL Safe Base64 并省略填充字符 =,三个段都是这种变体,解码时按字符数自动补位。
= 在正则里怎么匹配 Base64 ?
常见写法 ^[A-Za-z0-9+/]{4}([A-Za-z0-9+/]{4})*({0,2}=|={0,2})$ 之类容易出错,稳妥做法:先匹配字符集再校验长度是否 4 的倍数,= 只允许在末尾。
