在Python 3中如何正确地将字节转换为十六进制字符串?

388 投票
9 回答
623954 浏览
提问于 2025-04-16 21:05

在Python 3中,怎么才能正确地把字节转换成十六进制字符串呢?

我看到有人提到过一个叫bytes.hex的方法,还有bytes.decode的编码方式。我也试过一些其他的函数,但都没成功。我就是想把我的字节变成十六进制的格式!

9 个回答

52

Python有一些标准的字节到字节的编解码器,可以方便地进行一些转换,比如quoted-printable(适合7位ASCII字符)、base64(适合字母和数字)、十六进制转义、gzip和bz2压缩。在Python 2中,你可以这样做:

b'foo'.encode('hex')

在Python 3中,str.encodebytes.decode主要是用来在字节和字符串之间转换的。相反,你可以这样做,这种方法在Python 2和Python 3中都适用(s/encode/decode/g表示反向操作):

import codecs
codecs.getencoder('hex')(b'foo')[0]

从Python 3.4开始,还有一种更简单的选择:

codecs.encode(b'foo', 'hex')

这些杂项编解码器也可以在它们自己的模块中找到(如base64、zlib、bz2、uu、quopri、binascii);虽然它们的接口不太一致,但对于压缩编解码器来说,它提供了更多的控制选项。

109

使用 binascii 模块:

>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'

可以参考这个回答: Python 3.1.1 字符串转十六进制

745

从Python 3.5开始,这个问题终于不再让人觉得尴尬了:

>>> b'\xde\xad\xbe\xef'.hex()
'deadbeef'

反向操作:

>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'

这也适用于可变的 bytearray 类型。

参考链接: https://docs.python.org/3/library/stdtypes.html#bytes.hex

撰写回答