2012-09-25 137 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

相关问题