【问题标题】:Print string as hex literal python将字符串打印为十六进制文字 python
【发布时间】:2014-02-21 23:10:50
【问题描述】:

我有很多将字节数组视为字符串的预先存在的代码,即

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

哪个python总是打印为:

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

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

【问题讨论】:

  • print binascii.hexlify(data)
  • @agf :我只是从中学到了一些东西。这是一个很好的问题和一个很好的答案。我想赞成你的回答。您可以将其发布为答案吗?
  • 或者像x = r'\x01\x41\x42\x43'这样分配。
  • @hivert 作为答案发布。
  • @J.Katzwinkel 它不能用作二进制数据。

标签: python string escaping


【解决方案1】:

对于跨版本兼容的解决方案,请使用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

【讨论】:

  • 谢谢!你的回答对于我的目的来说已经足够接近了。我应该能够使用反斜杠进行打印,以便打印的是实际文字....
【解决方案2】:

你可以试试这样的:

>>> 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

【讨论】:

    【解决方案3】:

    要实际打印出字符串 ~literal(即,您可以剪切并粘贴回代码中以获取相同对象的内容)需要以下内容:

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

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2012-09-25
      • 2018-01-31
      • 2013-12-13
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多