2012-09-25 116 views
0

進一步討論此問題:Handling and working with binary data HEX with python(並感謝我收到的真棒指針)我被困在工具的最後一個方面。Python - 將原始二進制轉儲轉換爲ASCII HEX字節

我基本上是爲通過EOF標記的數據編寫一個文件清理器。這額外的數據意味着他們失敗了一些驗證工具我需要去除額外的數據,所以他們被提交給驗證器,但是我不想丟掉這些數據(事實上我必須保留它...)

我已經寫了一個XML容器來保存數據,以及一些其他出處/審計類型的值,但我仍然堅持優雅地在原始二進制文件和可以「烘焙」到文件中的東西之間移動。

例如:

JPG文件與(十六進制編輯器視圖)結束 96 1a 9c fd ab 4f 9e 69 27 ad fd da 0a db 76 bb ee d2 6a fd ff 00 ff d9 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

爲JPG的EOF標記是ff d9,所以清潔器的工作原理反向通過文件,直到其抵靠EOF標記匹配。在這種情況下,它會創建一個新的JPG文件在ff d9停止,然後嘗試剝離數據寫入到XML(通過ElementTree的LIB):changeString.text =str(excessData)

當然作爲XML作家正在寫這不會工作ASCII不是二進制轉儲。

在上述情況下,錯誤的是UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128),我可以看到,如果因爲它不是一個有效的ASCII字符

我的問題因此,這是我該如何優雅處理這個原始數據,在某種程度上,它可以存儲並在未來使用? (我打算寫一個'uncleaner的下,可以採取一個乾淨的文件和XML和重建原始文件...)

______EDIT_______

使用從下面的建議,這是回溯:

Traceback (most recent call last): 
    File "C:\...\EOF_cleaner\scripts\test6.py", line 87, in <module> main() 
    File "C:\...\EOF_cleaner\scripts\test6.py", line 73, in main splitFile(f_data, offset) 
    File "C:\...EOF_cleaner\scripts\test6.py", line 60, in splitFile makeXML(excessData) 
    File "C:\...\EOF_cleaner\scripts\test6.py", line 53 in makeXML ET.ElementTree(root).write(noteFile) 
    File "c:\python27\lib\xml\etree\ElementTree.py", line 815, in write serialize(write, self._root, encoding, qnames, namespaces) 
    File "c:\python27\lib\xml\etree\ElementTree.py", line 934, in _serialize_xml_serialize_xml(write, e, encoding, qnames, None) 
    File "c:\python27\lib\xml\etree\ElementTree.py", line 934, in _serialize_xml_serialize_xml(write, e, encoding, qnames, None) 
    File "c:\python27\lib\xml\etree\ElementTree.py", line 934, in _serialize_xml_serialize_xml(write, e, encoding, qnames, None) 
    File "c:\python27\lib\xml\etree\ElementTree.py", line 932, in _serialize_xml write(_escape_cdata(text, encoding)) 
    File "c:\python27\lib\xml\etree\ElementTree.py", line 1068, in _escape_cdata return text.encode(encoding, "xmlcharrefreplace") 
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128) 

拋出事物的線是changeString.text = excessData.encode('base64')(線45)和ET.ElementTree(root).write(noteFile)(線53)

+0

試圖寫'unicode(str(excessData))'? –

+0

@MahmoudAladdin謝謝,但是這給出了同樣的錯誤! –

+0

你的回溯表明,某個* else *也將二進制數據添加到你的樹*。如果你完全禁用'changeString.text'這行,你還會得到這個錯誤嗎? –

回答

4

使用Base64

excessData.encode('base64') 

稍後可以通過簡單的.decode('base64')調用很容易將其轉回二進制數據。

Base64編碼爲ASCII數據,以安全方式包含在XML中,格式合理;每3個字節的二進制信息變成4個Base64字符。

+1

謝謝,這看起來很簡單...我試圖將該行逐字逐句放在聲明excessData變量的行之後('excessData = f_data [offset: ]''但我仍然得到UnicodeDecode錯誤,我還需要做別的嗎? –

+1

@JayGattuso,'encode'不會修改數據,它會返回一個新的字符串,你可能想'excessData = f_data [ ('base64')' –

+0

'changeString.text = excessData.encode('base64')'should work;'.encode()'返回編碼值,它不會在原地更改字符串 –

1

原始字節轉換爲空格分隔的ASCII十六進制,你可以使用類似:

>>> a = "abc\x01\x02" 
>>> print(" ".join("{:02x}".format(x) for x in a)) 
61 62 63 01 02 

然而,在其他的答案中提到,像Base64是可能將是更高效,更輕鬆的工作用。

+0

不錯,它確實與binascii.hexlify(a)相同的結果 – papachan

相關問題