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不是首选。

+0

你不用'真的不想把'7'这个字符看作'0x07',是吗? –

+0

你使用哪个Python版本? – falsetru

+0

@TimPietzcker,你是对的。我将它修复为0x37(=='7') – Sammy

使用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') 
+0

This works几乎开箱即用。必须删除外部映射,并用bytearray替换它:'bytearray(map(ord,content.decode('string-escape')))'。很好的答案,我不知道解码。 – Sammy

+0

@Sammy,感谢您的反馈。我根据你的评论更新了答案。 – falsetru

下面是做到这一点的一种方法:

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

"".join([chr(int(i,16)) for i in data.split("\\x") if i])

+0

这不应该工作,因为并不是所有的字符串都以“\\ x”开头(注意在我的例子中是'7')。 – Sammy

+0

@Sammy哦,你说得对。我错过了那部分。谢谢 – Elisha