进一步讨论此问题: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)
试图写'unicode(str(excessData))'? –
@MahmoudAladdin谢谢,但是这给出了同样的错误! –
你的回溯表明,某个* else *也将二进制数据添加到你的树*。如果你完全禁用'changeString.text'这行,你还会得到这个错误吗? –