Python中的Hex到Base64转换

时间:2015-11-14 01:55:42

标签: python hex base64

我想将一个简单的HEX字符串(例如10000000000002ae)转换为Base 64。

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

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

但是我需要在脚本中转换一堆HEX值。

7 个答案:

答案 0 :(得分:16)

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

import codecs

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

答案 1 :(得分:14)

Python本身支持HEX和base64编码:

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

答案 2 :(得分:10)

您链接的工具只是将十六进制解释为字节,然后将这些字节编码为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'

答案 3 :(得分:6)

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

此打印:

cafebabe in base64: yv66vg==
yv66vg== in hex is: 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编码。

答案 4 :(得分:1)

Python本身支持HEX和base64编码:

import base64

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

    print b64

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

在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()