Python:将字符串转换为其二进制表示形式
问题描述:
我使用Python 2.7.X.
我有以下内容文本文件:Python:将字符串转换为其二进制表示形式
\xe87\x00\x10LOL
注意,这是文本本身,而不是它的二进制表示(这意味着第一个字符是“\\”,而不是0xe8) 当我读它(作为二进制),我得到:
a = "\\\\xe87\\\\x00\\\\x10LOL"
因为它是一个文本文件。
我想将它转换为二进制形式,这意味着我想这与人物
0xe8,0×37,0×00,0×10,0x4c,0x4f,0x4c开头的文件。
(注意,0x4c =='L',0x4f =='O')。
我该怎么做?
尝试了各种各样的解决方案,像hexlify \ unhexlify,int(c,16),但似乎我错过了一些东西。
另外请注意,文件的长度会有所不同,所以struct.pack不是首选。
答
使用string-escape
or unicode-escape
encoding:
>>> content = r'\xe87\x00\x10LOL'
>>> print content
\xe87\x00\x10LOL
>>> content
'\\xe87\\x00\\x10LOL'
>>> content.decode('string-escape')
'\xe87\x00\x10LOL'
>>> map(hex, map(ord, content.decode('string-escape')))
['0xe8', '0x37', '0x0', '0x10', '0x4c', '0x4f', '0x4c']
>>> bytes(map(ord, content.decode('string-escape')))
'[232, 55, 0, 16, 76, 79, 76]'
>>> bytearray(map(ord, content.decode('string-escape')))
bytearray(b'\xe87\x00\x10LOL')
答
下面是做到这一点的一种方法:
In [26]: a = r"\xe87\x00\x10LOL"
In [27]: b = ast.literal_eval("'" + a + "'")
In [28]: open("test.dat", "w").write(b)
In [29]:
[1]+ Stopped ipython
$ xxd test.dat
0000000: e837 0010 4c4f 4c .7..LOL
(还有比literal_eval
可能是更好的工具,但就是这样问世的第一想到在这个早期小时)
+0
这是开箱即用,但我认为它不那么优雅:) – Sammy
你不用'真的不想把'7'这个字符看作'0x07',是吗? –
你使用哪个Python版本? – falsetru
@TimPietzcker,你是对的。我将它修复为0x37(=='7') – Sammy