32

在 Python 2 中,要获取字符串中十六进制数字的字符串表示形式,您可以这样做

>>> '\x12\x34\x56\x78'.encode('hex')
'12345678'

在 Python 3 中,这不再起作用(在 Python 3.2 和 3.3 上测试):

>>> '\x12\x34\x56\x78'.encode('hex')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: unknown encoding: hex

这里至少有一个关于 SO 的答案提到hex编解码器已在 Python 3 中删除。但是,根据文档,它在 Python 3.2 中被重新引入,作为“字节到字节的映射”。

但是,我不知道如何让这些“字节到字节的映射”起作用:

>>> b'\x12'.encode('hex')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'bytes' object has no attribute 'encode'

而且文档也没有提到这一点(至少不是我看过的地方)。我一定错过了一些简单的东西,但我看不到它是什么。

4

4 回答 4

30

您需要通过codecs模块和hex_codec编解码器(或其hex别名,如果可用*):

codecs.encode(b'\x12', 'hex_codec')

* 来自文档:“3.4 版更改:恢复二进制转换的别名”

于 2012-10-16T14:58:36.617 回答
14

另一种使用方式binascii.hexlify()

>>> import binascii
>>> binascii.hexlify(b'\x12\x34\x56\x78')
b'12345678'
于 2012-10-16T16:19:05.960 回答
10

使用base64.b16encode()

>>> import base64
>>> base64.b16encode(b'\x12\x34\x56\x78')
b'12345678'
于 2012-10-16T15:50:49.937 回答
6

binascii顺便说一下,方法更简单:

>>> import binascii
>>> x=b'test'
>>> x=binascii.hexlify(x)
>>> x
b'74657374'
>>> y=str(x,'ascii')
>>> y
'74657374'
>>> x=binascii.unhexlify(x)
>>> x
b'test'
>>> y=str(x,'ascii')
>>> y
'test'
于 2012-11-18T07:03:28.703 回答