base64编码和解码问题,其中a不等于b。

3

考虑下面这个Python示例:

sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KB===='
a = base64.b32decode(sample)
b = base64.b32encode(a)

为什么 sample != b?但是在哪里呢?
sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KBAAAA'

然后

样例等于b

2个回答

4

你得到的第一个样本无效的base64编码。

摘自维基百科:

当要编码的字节数不是3的倍数(也就是说,如果最后一个块只有一个或两个字节的输入),则执行以下操作:添加值为零的额外字节,使其成为三个字节,并执行转换为base64。如果只有一个有效的输入字节,则选择前两个base64数字,如果有两个有效的输入字节,则选择前三个base64数字。可能会添加“=”字符以使最后一个块包含四个base64字符。

http://en.wikipedia.org/wiki/Base64#Examples

编辑:

摘自RFC 4648:

如果编码数据的末尾可用位数少于24位,则执行特殊处理。在数量的末尾始终完成完整的编码量。当输入组中可用的输入位少于24位时,会添加值为零的位(在右侧)以形成6位组的整数个数。使用“=”字符对数据进行填充。

你的示例末尾的4个8位(即“=”)比24个位更多,因此它们是不必要的。(不确定示例的数据类型,但请查明并将其大小乘以字符数除以24)

关于你的特定示例

base-encoding 读取24位的块,并且只需要在基础字符串结尾处添加 '=' 填充字符,以使将其分成24位块后剩余的任何内容都可以“大小为24”,因此可以被解码器解析。由于字符串末尾的 ===='s 超过了24位,它们是无用的,因此:无效...


嗨,我不明白为什么第一个示例无效?你能否请解释一下。在它上面运行a = base64.b32decode(sample)就可以正常工作。 - Ernest
你好,感谢您的回答,能否再详细解释一下?我的样例是一个Base32字符串,我正在尝试将其传递到apns-python-wrapper中。也许编码和解码的末位是旋转位,因此我使用编码和解码进行验证可能无效? - Ernest

1

首先,让我们明确一点:您的问题是关于base32而不是base64。

您原始的示例有点太长了。末尾有4个=填充,意味着至少有20位填充。位数必须是8的倍数,因此实际上是24位。在base32中,B的编码为1,这意味着其中一个填充位被设置了。这违反了规范,规定所有填充位都必须清除。解码会完全删除该位,而编码会产生正确的值A而不是B


你好,感谢你的回答。你能否再详细解释一下?我正在尝试将一个Base32字符串传递给apns-python-wrapper。也许编码和解码结束位是旋转位置,我尝试使用编码和解码进行验证可能是无效的? - Ernest
@TurbZ,输入无效。最后一个编码位是1,但它应该是0,因为它是填充的一部分。解码和重新编码可以修复它,所以它不再与原始数据匹配。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接