将Python字符串转换为其ASCII表示形式

6

如何将Python中的字符串转换为其ASCII十六进制表示形式?

示例: 我想要将'\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 转换为 001bd47da4f3

5个回答

6
>>> text = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'.rstrip('\0')
>>> print "".join("%02x" % ord(c) for c in text)
001bd47da4f3

根据martineau的评论,以下是Python 3的方法:
>>> "".join(format(ord(c),"02x") for c in text)

2
+1 因为它是最佳答案,且不依赖于 Python 版本。 - martineau
我选择这个解决方案,因为我认为它是最直观的;但是@martineau:它确实依赖于Python版本。据我所知,在Python 3中不再支持%参数。 - Manuel Faux
@Manuel Faux:糟糕,我的错。嗯,既然它可以更改为:print "".join(format(ord(c),"02x") for c in text),这样至少可以使它从2.6到3.x工作,我不会收回+1,因为它很接近。;-) - martineau
@Manuel Faux,@Ryan Ginstrom:请看下面我自己的Python版本无关的答案,它不依赖于字符串格式化或插值。 - martineau
@Ryan Ginstrom:实际上,在Python 2.6、2.7和Python 3中,"".join(format(ord(c),"02x") for c in text)版本都应该可以工作。 - martineau

5

在Python 2.x中,您可以将字符串编码为其十六进制表示。但是,在Python 3.x中,这种方法将不再适用。

>>> print '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'.encode("hex")
'001bd47da4f300000000000000000000'

目前还不清楚您是否有一个包含转义字符的字符串(基本上是r'\x00\x1b'等等),也不清楚为什么您不希望尾随的零存在,但您可以在编码之前使用.rstrip("\x00")来删除这些字符。


关于可能的嵌入式转义,这是一个好观点。另外很奇怪,大家都在使用示例输入,但没有人评论它错了(缺少'7d'并且有'}')--然而所有人都给出了期望的输出... - martineau
1
} 不需要转义,但如果转义的话应该是 \x7d。这个字符串意思很清楚,只是并没有对所有字符进行转义。 - Ivo van der Wijk
从 OP 的输入和输出中可以完全清楚地看出,输入是 '\x00\x1b' 等,而不是 r'\x00\x1b' 等。 - John Machin
哇,真不敢相信我没注意到 '}' 是 \x7d -- 看来 @Glenn Maynard 是对的。 - martineau

4

替代方案:

[Python 2.7]
>>> data = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> import binascii
>>> binascii.b2a_hex(data.rstrip('\x00'))
'001bd47da4f3'
>>>

[Python 3.1.2]
>>> data = b'\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> import binascii
>>> binascii.b2a_hex(data.rstrip(b'\x00'))
b'001bd47da4f3'
>>>

1
@J.F. Sebastian: "hexlify"很愚蠢,甚至不是一个混成词(应该是“hexify”),而只需几秒钟查看binascii文档,就会发现那些非愚蠢的名称都遵循着一个模式... b2a_hex表示“二进制转换为ASCII码,16进制模式”。 - John Machin
1
无论你是否认为hexlify()是一个“合适”的混成词,或者只是看起来很傻,它确实是binascii模块中同一函数的两个名称之一——因此显然其他人也认为它是一个更具描述性或可读性的名称。 - martineau

2
这是另一个答案,应该适用于从3.x一直到2.0的所有Python版本(根据pyqver的最小版本)。尽管如此,因为它基于简单的表格(而不是字典)查找,所以它也应该相对快速。
需要进行一次简单的设置,但非常简单,并避免使用任何为了版本独立性而添加(或删除)的许多增强功能。
numerals = "0123456789abcdef"
hexadecimal = [i+j for i in numerals for j in numerals]

text = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'    
print ''.join([hexadecimal[ord(c)] for c in text.rstrip('\0')])
# 001bd47da4f3

-4

binascii.hexlify():

import binascii

byte_string = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
print binascii.hexlify(byte_string.rstrip('\x00'))

# -> 001bd47da4f3

请查看 @John Machin的答案

1
去除输出中的零是正确的,我认为他想要在结果中去掉尾随的零。 - Manuel Faux
-1 个奇怪的巴洛克式拜占庭倒退解决方案 - John Machin
@IvovanderWijk:我已经更新了答案。你介意删除过时的评论吗?binascii.hexlify()经受住了时间的考验(它适用于Python 2/3("abc".encode('hex')仅适用于Python 2,而b"abc".hex()仅适用于Python 3.5+)。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接