【问题标题】:The fundametal method to convert a hex to base64 in python3python3中将十六进制转换为base64的基本方法
【发布时间】:2019-03-08 06:16:36
【问题描述】:

我想将给定的十六进制转换为 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”的答案,它在某些 place(oQ==) 和其他 place(wqE=) 中的不同

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

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

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

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

'a' 转 base64

1010(a 的二进制)

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

【问题讨论】:

    标签: python python-3.x base64 hex zero-padding


    【解决方案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:填充规则详见the RFC

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      相关资源
      最近更新 更多