2012-10-16 43 views
22

在Python 2,得到的字符串中的十六进制数字的字符串表示,你可以做如何在Python 3.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 

至少有one answer这里上,使得提到,hex编解码器在Python 3被移除但随后,according to the docs,有人在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' 

而且文档不提,要么(至少不是我看了) 。我必须错过简单的东西,但我看不到它是什么。

+0

看到这样的回答:HTTP:// stackoverflow.com/a/2340358/1298523 – scape

+2

我会争辩反对把它当作愚蠢的东西来关闭这个问题特别关于Python 3.2,其中'hex'编解码器正式倒退(但很难找到)。链接的问题是关于Python 3.1的。 –

回答

24

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

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

*从文档:“改变在3.4版本:恢复的二进制的别名转换为“

+4

难道你不是指'codecs.encode(b'\ x12','hex_codec')'?用''hex''我只能得到'LookupError:unknown encoding:hex' – mata

+3

docs说'hex'是3.2中的一个别名,但是我的3.2.3安装有同样的错误。 –

+2

尽管我找不到对错误修复的引用,但它看起来像'hex'在3.4中再次起作用。 –

13

还有一种方法:

>>> import binascii 
>>> binascii.hexlify(b'\x12\x34\x56\x78') 
b'12345678' 
+0

所以你看了一眼所谓的笨蛋,是吗? :) –

+1

不,这就是我通常的做法:) –

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' 
+0

'str(x,'ascii')'更好的拼写'x.decode('ascii')' – Eric

+2

'binascii'似乎也更快,对于任何关心。 –

相关问题