1

我想将给定的十六进制转换为base64(在python中不使用任何库)。正如我从其他 stackoverflow 答案中了解到的,我们可以将 3 个十六进制(12 位,即每个 4 位)分组以获得 2 个 base64 值(12 位,即每个 6 位)。我们还可以将 6 个十六进制(24 位)分组为 4 个 base64 值(24 位)。

标准程序是将所有十六进制的二进制位附加在一起,并从左开始分组为 6 个数据包。

我的问题是关于我们需要填充的情况:(假设我们将 3 个十六进制转换为 2 个 base64)当我们只剩下 2 个或 1 个十六进制值要转换时,就会出现这种情况。举个例子:

'a1' 到 base64

10100001(a1 的二进制)

101000 01(0000) //将 6 个分组并在需要时添加额外的 0

这给出了“oQ”在某个地方的答案(oQ==)和在其他地方不同的答案(wqE=)

Q1。两个来源中哪一个给出了正确的答案?为什么另一个是错误的在线解码器?

Q2。我们如何在这里实现'='的数量?(我们可以像上面的例子一样在任何需要的地方添加足够的 0,因此在这里结束答案只是 oQ 而不是 oQ== ,假设 oQ== 是正确的)

我的概念是:如果十六进制的长度为 2(而不是 3),我们用一个 = 填充(因此在上述情况下符合答案 wqE=),否则如果十六进制的长度为 1(而不是 3),我们用 double ='s 填充

同时,我很困惑,如果将 3 个十六进制转换为 2 个 base64,我们将永远不需要两个 =。

'a' 到 base64

1010(a的二进制)

Q3。如何将十六进制“a”转换为 base64。

4

1 回答 1

1

Base64 由RFC 4648定义为“旨在表示任意八位字节序列”。八位字节是 8 位的单位,实际上与字节同义。当您的输入采用十六进制字符串的形式时,您的第一步应该是将其解码为字节字符串。每个字节需要两个十六进制字符。如果输入的长度是奇数,则合理的做法是引发错误。

为了解决您编号的问题:

Q1:即使在实现自己的编码器时,也可以利用 Python 标准库进行调查。将这两个结果解码回字节给出:

>>> import base64
>>> base64.b64decode(b'oQ==')
b'\xa1'
>>> base64.b64decode(b'wqE=')
b'\xc2\xa1'

所以,oQ==是正确的,而前面添加了wqE=一个字节。c2我可以猜测这是在 Base64 之前应用 UTF-8 编码的结果。确认:

>>> '\u00a1'.encode('utf-8')
b'\xc2\xa1'

Q2:填充规则在RFC中有详细说明。

Q3:这是模棱两可的,你感到困惑是对的。

于 2018-10-04T05:43:55.580 回答