2016-05-01 25 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個字節)。