base64编码&解码问题,其中a!= b

时间:2012-09-14 00:35:10

标签: python base64

在Python中给出了这个例子

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

为什么会这样呢

样品!= b?

但是

sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KBAAAA'

然后

sample == b

2 个答案:

答案 0 :(得分:4)

你到那里的第一个样本是无效的base64。

取自维基:

  

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

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

编辑:

取自RFC 4648:

  

如果可用的位数少于24位,则执行特殊处理   在被编码的数据的末尾。完整编码量是
  总是在数量结束时完成。当少于24输入时   位在输入组中可用,添加值为零的位   (在右侧)形成一个整数6位组。填充
  在数据的末尾使用'='字符执行。

4次8位(='s)(在sample的末尾)超过24位,因此它们至少是不必要的。 (不确定数据类型sample是什么,但找出并取其大小乘以字符数除以24)

关于您的特定sample

base-encoding以24位块的形式读取,并且只需要在base'd字符串的末尾加上'='填充字符,以便在将字符串拆分为24位块之后生成剩下的字符串“大小为24”,这样就可以了由解码器解析。 因为你的字符串末尾的===='s超过24位,所以它们没用,因此:无效...

答案 1 :(得分:1)

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

您的原始样本有点太长了。最后有4 =个填充,意味着至少20位填充。位数必须是8的倍数,所以它实际上是24位。 base32中B的编码为1,这意味着其中一个填充位已设置。这违反了规范,规定所有填充位必须清除。解码完全丢弃该位,编码产生适当的值A而不是B