2014-02-21 98 views
4

我有很多的预先存在的代码,把字节数组作为字符串,即打印字符串作为十六进制字面蟒蛇

In [70]: x = '\x01\x41\x42\x43' 

的Python始终打印为:

In [71]: x 
Out[71]: '\x01ABC' 

这使得调试痛苦,因为我打印的字符串看起来不像我的代码中的文字。如何将字符串打印为十六进制文字?

+5

'打印binascii.hexlify(数据)' – agf

+2

@agf:我刚学的东西从。这是一个很好的问题和一个很好的答案。我想提高你的答案。你能把它作为答案发布吗? – hivert

+1

或指定为'x = r'\ x01 \ x41 \ x42 \ x43''。 –

回答

2

对于跨版本兼容的解决方案,使用binascii.hexlify

>>> import binascii 
>>> x = '\x01\x41\x42\x43' 
>>> print x 
ABC 
>>> repr(x) 
"'\\x01ABC'" 
>>> print binascii.hexlify(x) 
01414243 

作为.encode('hex')encode误用和在Python 3已被删除:

Python 3.3.1 
Type "help", "copyright", "credits" or "license" for more information. 
>>> '\x01\x41\x42\x43'.encode('hex') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
LookupError: unknown encoding: hex 
+0

谢谢!你的回答足够接近我的目的。我应该能够使用反斜杠进行打印,以便打印的内容是实际的文字.... –

0

你可以尝试这样的事情:

>>> x = '\x01\x41\x42\x43' 
>>> x.encode('hex') 
'01414243' 

>>> x = r'\x01\x41\x42\x43' 
>>> x 
'\\x01\\x41\\x42\\x43' 

>>> x = '\x01\x41\x42\x43' 
>>> print " ".join(hex(ord(n)) for n in x) 
0x1 0x41 0x42 0x43 
0

要实际打印出字符串〜文字(即你可以剪切和粘贴到您的代码以获得相同的对象)的事情,需要类似:

>>> x = '\x1\41\42\43' 
>>> print "'" + ''.join(["\\"+ hex(ord(c))[-2:] for c in x]) + "'" 
'\x1\41\42\43' 
相关问题