2010-10-03 164 views

回答

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 

按马蒂诺的评论,这里是Python 3路:

>>> "".join(format(ord(c),"02x") for c in text) 
+0

'%02x'会更好。 – 2010-10-03 16:46:40

+0

好吧,我将它改为使用%02x – 2010-10-03 17:03:28

+2

+1,因为这是最好的答案,它不依赖于Python版本。 – martineau 2010-10-03 19:39:54

-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's answer

+1

剥离输出是我认为是正确的。他想要删除结果中的尾部零。 – 2010-10-03 16:38:05

+0

-1 Bizarre Baroque Byzantine Bassackwards本月解决方案 – 2010-10-03 20:59:07

+0

@IvovanderWijk:我已经更新了答案。你介意删除你过时的评论吗? binascii.hexlify()经受了时间的考验(它可以在Python 2/3上工作(“abc”.encode('hex')仅适用于Python 2,b“abc”.hex()仅适用于Python 3.5+ ) – jfs 2016-11-11 03:47:47

5

使用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”)

+0

关于可能的嵌入式转义的好处也很奇怪,每个人都在使用样例输入,但没有人评论过它是乱码(缺少'7d'并且有'}')所有提供所需的输出... – martineau 2010-10-03 19:49:07

+1

}不需要转义,但转义它将是\ x7d。字符串非常合理,只是并非所有字符都被转义。 – 2010-10-03 20:16:48

+0

OP的输入和输出完全清楚输入是'\ x00 \ x1b'等不是r'\ x00 \ x1b'等。 – 2010-10-03 20:54:56

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

'hexlify()'可能更具可读性。 – jfs 2010-10-04 02:46:56

+1

@ J.F。塞巴斯蒂安:“hexlify”是愚蠢的,它甚至不是一个portmanteau单词(这将是“hexify”),而对binascii文档的几秒钟读取显示非愚蠢的名字遵循一种模式... b2a_hex表示“binary to ascii ,十六进制模式“ – 2010-10-04 04:53:35

+1

FWIW,不论是'hexlify()'一个”适当的“portmanteau还是只是看起来很愚蠢,它**是** binascii模块中同一个函数的两个名称之一 - 所以考虑到其他人显然也认为这是一个更具描述性或可读性的名字。 – martineau 2010-10-06 14:52:33

2

这里的另一个答案是应该使用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 
相关问题