2016-05-01 28 views
1

我有以下问题:读 XHH从文件逃脱原始二进制在Python

我想从文件中读取到一个原始二进制字符串:

的文件看起来像这样(用转义字符,而不是二进制数据):

\ XFC \ xe8 \ X82 \ X00 \ X00 \ X00 \ X60 \ X89 \ xe5 \ X31 \ XC0 \ 64 \ x8b \ X50 \ X30 \ x8b \ X52

使用的代码:

数据=打开( “文件名”, “RB”)读()

结果而获得:

B“\\ XFC \\ xe8 \\ X82 X00 \\ \\ \\ X00 X00 X60 \\ \\ \\ X89 \\ xe5 X31 \\ \\ XC0 \\ 64 \\ x8b X50 X30 \\ \\ \\ x8b X52"

随着dobule \。

我该如何读取它为二进制字符串:\xaa个字符? (不含转义字符)

+0

您的文件是由您所看到的内容代表的二进制文件,还是ascii实际上*您向我们展示的内容,并且您想要解释它? – cge

+0

字符串正在被正确读取,反斜杠在python字符串中用'\\'转义序列表示。当您打印未格式化的字符串(带有b“”前缀)时,会显示转义序列字符。在关于如何计划使用字符串以获得更多有用答案的问题中添加更多详细信息 – codeln

+0

这是一个简单的txt文件,我应该写下对不起。 – Symonen

回答

0

好的。你的问题在于你问的是错误的问题。你的数据文件不是原始的二进制字符串,它是一个编码的字符。不过,当你需要解码转义码时,你将它作为原始二进制文件读取。尝试

data = open("filename", "r", encoding='unicode_escape').read().encode('raw_unicode_escape') 

改为。

编辑:好的,现在可以使用。你需要编码为raw_unicode_escape,而不是utf-8(默认)。

+0

是的,我的问题是不对的。但是你的解决方案的工作非常感谢。 – Symonen

0

此输出确定

Python是输出这个数据与双反斜杠,以表明它是非打印。但是,它的正确存储了,作为字节。

+0

不完全,当我想用​​它时,我得到了错误。 如果我在我的代码中添加以下内容: data = b“\ xaa \ xaa \ xaa”但是当我从上面的文件中读取它时,我得到了en错误 – Symonen

+0

@Symonen,__哪一个?__ – ForceBru

+0

不要混淆' b'\\ xfc''(4字节)和'b'\ xfc''(1字节)。 – jfs

0

要转换4个ASCII字符(\xfc)从文件到一个单一的字节(252==0xfc),即可读ASCII字符作为字节(data = open("filename", "rb").read()),除去\x前缀并转换得到的十六进制字节串到含有相应的原始bytes二进制数据:

>>> import binascii 
>>> data = b'\\xfc\\xe8\\x82' 
>>> binascii.unhexlify(data.replace(b'\\x', b'')) 
b'\xfc\xe8\x82' 

最好是避免存储数据b'\\xfc'(4个字节),而不是在第一个地方b'\xfc'(1个字节)。