如何将Python中的字符串转换为ASCII十六进制表示形式?将Python字符串转换为其ASCII码表示形式
例如:我想要结果'\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
在001bd47da4f3
。
如何将Python中的字符串转换为ASCII十六进制表示形式?将Python字符串转换为其ASCII码表示形式
例如:我想要结果'\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
在001bd47da4f3
。
>>> 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
按马蒂诺的评论,这里是Python 3路:
>>> "".join(format(ord(c),"02x") for c in text)
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
剥离输出是我认为是正确的。他想要删除结果中的尾部零。 – 2010-10-03 16:38:05
-1 Bizarre Baroque Byzantine Bassackwards本月解决方案 – 2010-10-03 20:59:07
@IvovanderWijk:我已经更新了答案。你介意删除你过时的评论吗? binascii.hexlify()经受了时间的考验(它可以在Python 2/3上工作(“abc”.encode('hex')仅适用于Python 2,b“abc”.hex()仅适用于Python 3.5+ ) – jfs 2016-11-11 03:47:47
使用python 2.x,您可以将字符串编码为十六进制表示。它不会与python3.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 2010-10-03 19:49:07
}不需要转义,但转义它将是\ x7d。字符串非常合理,只是并非所有字符都被转义。 – 2010-10-03 20:16:48
OP的输入和输出完全清楚输入是'\ x00 \ x1b'等不是r'\ x00 \ x1b'等。 – 2010-10-03 20:54:56
替代删除这些编码前:
[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'
>>>
'hexlify()'可能更具可读性。 – jfs 2010-10-04 02:46:56
@ J.F。塞巴斯蒂安:“hexlify”是愚蠢的,它甚至不是一个portmanteau单词(这将是“hexify”),而对binascii文档的几秒钟读取显示非愚蠢的名字遵循一种模式... b2a_hex表示“binary to ascii ,十六进制模式“ – 2010-10-04 04:53:35
FWIW,不论是'hexlify()'一个”适当的“portmanteau还是只是看起来很愚蠢,它**是** binascii模块中同一个函数的两个名称之一 - 所以考虑到其他人显然也认为这是一个更具描述性或可读性的名字。 – martineau 2010-10-06 14:52:33
这里的另一个答案是应该使用3.x的所有Python版本一直回到2.0(根据pyqver的最小版本)。尽管如此,因为它基于一个简单的表(不是字典)查找,它也应该相对较快。
需要一次性设置,但是非常简单,并且避免使用在追求版本独立性时沿途添加(或删除)的许多增强功能中的任何一种。
numerals = "abcdef"
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
'%02x'会更好。 – 2010-10-03 16:46:40
好吧,我将它改为使用%02x – 2010-10-03 17:03:28
+1,因为这是最好的答案,它不依赖于Python版本。 – martineau 2010-10-03 19:39:54