You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Base64验证异常:b'111='编码后为何变为b'110='?

为什么b'111='编码解码后不等于自身?

这个问题得从Base64的底层编码规则说起,咱们一步步拆解:

  • Base64的核心逻辑:每个Base64字符对应6位二进制,编码时会把原始的8位字节拆成6位一组,最后如果位数不够,会用0补位,再用=填充到4的倍数长度。解码时则反向操作,忽略补位的0和填充的=。
  • 分析你的输入b'111=':
    • 在Base64索引表中,字符'1'对应的数值是17,转换成6位二进制是010001。
    • 三个'1'就对应三组6位二进制:010001 010001 010001,加上一个=,说明原始数据是2字节(因为1个=代表补了2位,总位数18位去掉补的2位,就是16位=2字节)。
  • 解码过程:b64decode(b'111=')会自动忽略补位的最后2位,只取前16位有效数据,也就是01000101 00010100,对应的字节是b'\x45\x14'。
  • 重新编码过程:把b'\x45\x14'的二进制串0100010100010100拆成三组6位:010001 010001 010000。第三组的二进制010000对应Base64索引16,也就是字符'0',再补一个=,最终得到b'110='。

说白了,b'111='其实是不符合Base64规范的字符串:当原始数据是2字节时,第三组6位的最后两位必须是补位的0,但你的输入里第三组是010001(最后两位是01),属于“不规范”的编码。Python的base64模块虽然会容错解码这种字符串,但重新编码时会严格按照规则生成正确的补位,所以结果和原输入不一样。

内容的提问来源于stack exchange,提问作者vidstige

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:51:03