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字节)。
- 在Base64索引表中,字符
- 解码过程:
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
相关产品推荐
相关产品推荐

