【问题标题】:Hex to Base64 conversion in PythonPython中的十六进制到Base64的转换
【发布时间】:2016-02-15 17:14:36
【问题描述】:

我想将10000000000002ae等简单的十六进制字符串转换为Base64。

将十六进制字符串转换为字节,然后将字节编码为 base64 表示法,因此该字符串的预期输出:EAAAAAAAAq4=

我在网上找到了一个工具:http://tomeko.net/online_tools/hex_to_base64.php?lang=en

但我有一堆 HEX 值需要在脚本中进行转换。

【问题讨论】:

  • 我不得不去工具本身并运行一个实验来看看是什么意思。该工具将十六进制表示法解码为字节,然后将该二进制数据转换为 base64。
  • 始终尝试将您的问题分解为子问题,并尝试了解转换的实际作用。这里涉及的两个步骤都已经在 Stack Overflow 和其他地方得到了广泛的回答。

标签: python hex base64


【解决方案1】:

2020 年 8 月 26 日编辑:根据 cmets 中 Ali 的建议,使用 codecs.encode(b, "base64") 会导致 MIME 语法出现额外的换行符。仅当您确实需要这些换行符格式时才使用此方法。

对于纯 Base64 编码/解码,请使用 base64.b64encodebase64.b64decode。详情请见the answer from Ali


在 Python 3 中,包括 Hex 和 Base64 在内的任意编码已移至 codecs 模块。从十六进制 str 获取 Base64 str

import codecs

hex = "10000000000002ae"
b64 = codecs.encode(codecs.decode(hex, 'hex'), 'base64').decode()

【讨论】:

  • 由于某种原因,最后添加了一个换行符。
  • @user124384 - 在末尾添加 .replace("\n", "")
  • 是的,奇怪的是它在解码后添加了一个换行符。是为了漂亮的打印吗?
  • 警告!有了这个答案,您将在每 76 个字节的输出后得到一个换行符,因为它转换为多行 MIME base64。请参阅my answer 以获得正确的转换。
【解决方案2】:
from base64 import b64encode, b64decode

# hex -> base64
s = 'cafebabe'
b64 = b64encode(bytes.fromhex(s)).decode()
print('cafebabe in base64:', b64)

# base64 -> hex
s2 = b64decode(b64.encode()).hex()
print('yv66vg== in hex is:', s2)
assert s == s2

打印出来:

base64 中的咖啡宝贝:yv66vg== yv66vg== 十六进制是:cafebabe

文档中的相关函数,十六进制转base64:

Base64 转十六进制:


我不明白为什么许多其他答案都让它变得如此复杂。例如,截至 2020 年 8 月 26 日的the most upvoted answer

  • 这里不需要codecs 模块。
  • codecs 模块在底层使用base64.encodebytes(s)(请参阅reference here),因此它转换为multiline MIME base64,因此每输出76 个字节就会有一个新行。除非您通过电子邮件发送,否则很可能不是您想要的。

至于在编码字符串或解码字节时指定'utf-8':它增加了不必要的噪音。默认情况下,Python 3 对字符串使用 utf-8 编码。标准库的编写者将编码/解码方法的默认编码也设为 utf-8 并非巧合,这样您就不必一遍又一遍地不必要地指定 utf-8 编码。

【讨论】:

  • 感谢您指出这一点!我个人使用base.b64<encode|decode> 已经好几年了。直到现在我才意识到 codecs 库中隐含的 MIME 语法。我已经编辑了我的答案,并在开头添加了指向您的链接。
  • @EanaHufwe 好的,我很高兴我们已经清理了这个!
【解决方案3】:

Python 2 原生支持 HEX 和 base64 编码:

encoded = HEX_STRING.decode("hex").encode("base64")

(如果您使用的是 Python 3,请参阅 Eana HufweAli 的答案)

【讨论】:

  • 警告!使用 Eana Hufwe 的回答,您将在每 76 个字节的输出后得到一个换行符,因为它转换为多行 MIME base64。请参阅my answer 以获得正确的转换。
  • 这个答案对 Python 3 没用,所以应该删除。 Python 2 已经过时了。
【解决方案4】:

您链接到的工具只是将十六进制解释为字节,然后将这些字节编码为 Base64。

要么使用binascii.unhexlify() function 将十六进制字符串转换为字节,要么使用bytes.fromhex() class method。然后使用binascii.b2a_base64() function 将其转换为Base64:

from binascii import unhexlify, b2a_base64

result = b2a_base64(unhexlify(hex_string))

from binascii import b2a_base64

result = b2a_base64(bytes.fromhex(hex_string))

在 Python 2 中,您还可以使用 str.decode()str.encode() 方法来实现相同的目的:

result = hex_string.decode('hex').encode('base64')

在 Python 3 中,您必须为此使用 codecs.encode() 函数。

Python 3 中的演示:

>>> bytes.fromhex('10000000000002ae')
b'\x10\x00\x00\x00\x00\x00\x02\xae'
>>> from binascii import unhexlify, b2a_base64
>>> unhexlify('10000000000002ae')
b'\x10\x00\x00\x00\x00\x00\x02\xae'
>>> b2a_base64(bytes.fromhex('10000000000002ae'))
b'EAAAAAAAAq4=\n'
>>> b2a_base64(unhexlify('10000000000002ae'))
b'EAAAAAAAAq4=\n'

Python 2.7 演示:

>>> '10000000000002ae'.decode('hex')
'\x10\x00\x00\x00\x00\x00\x02\xae'
>>> '10000000000002ae'.decode('hex').encode('base64')
'EAAAAAAAAq4=\n'
>>> from binascii import unhexlify, b2a_base64
>>> unhexlify('10000000000002ae')
'\x10\x00\x00\x00\x00\x00\x02\xae'
>>> b2a_base64(unhexlify('10000000000002ae'))
'EAAAAAAAAq4=\n'

【讨论】:

    【解决方案5】:

    如果有人正在寻找 python3 单线(bash):

    python -c "import codecs as c; print(c.encode(c.decode('10000000000002ae', 'hex'), 'base64').decode())"
    

    【讨论】:

      【解决方案6】:

      在python3中,你可以使用bytes.fromhex转字节,使用base64包将字节转为base64

      hex_str = '01'
      encoded_str = base64.b64encode(bytes.fromhex(hex_str)).decode('utf-8')
      decoded_str = base64.b64decode(encoded_str.encode('utf-8')).hex()
      

      【讨论】:

        【解决方案7】:

        Python 原生支持 HEX 和 base64 编码:

        import base64
        
        def main():
            b16 = bytearray('10000000000002ae'.decode('hex'))
            b64 = base64.b64encode(b16)
        
            print b64
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-02
          • 2017-12-05
          • 1970-01-01
          • 2018-09-10
          • 2022-10-14
          • 1970-01-01
          • 2017-05-05
          • 1970-01-01
          相关资源
          最近更新 更多