如何在Python 3.2或更高版本中使用'hex'编码?

Tim*_*ker 29 python encoding hex python-3.x

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

>>> '\x12\x34\x56\x78'.encode('hex')
'12345678'
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

这里至少有一个答案提到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'
Run Code Online (Sandbox Code Playgroud)

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

eca*_*mur 28

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

codecs.encode(b'\x12', 'hex_codec')
Run Code Online (Sandbox Code Playgroud)

*来自文档:"在版本3.4中更改:恢复二进制转换的别名".

  • 你不是指'codecs.encode(b'\ x12','hex_codec')`?使用''hex'`我只得到`LookupError:未知编码:hex` (5认同)
  • 文档说`hex`是3.2中的别名,但我的3.2.3安装有同样的错误. (3认同)
  • 虽然我找不到对错误修正的引用,但看起来像`hex`在3.4版本中再次起作用. (2认同)

Mar*_*nen 14

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

>>> import binascii
>>> binascii.hexlify(b'\x12\x34\x56\x78')
b'12345678'
Run Code Online (Sandbox Code Playgroud)


dan*_*n04 10

使用base64.b16encode():

>>> import base64
>>> base64.b16encode(b'\x12\x34\x56\x78')
b'12345678'
Run Code Online (Sandbox Code Playgroud)


iMa*_*gur 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'
Run Code Online (Sandbox Code Playgroud)

  • 对于任何关心的人来说,`binascii`似乎也更快. (2认同)

fab*_*bio 1

从 python 3.5 开始,您可以简单地使用.hex()

>>> b'\x12\x34\x56\x78'.hex()
'12345678'
Run Code Online (Sandbox Code Playgroud)