0

除了这个问题:使用python处理和使用二进制数据十六进制 (感谢我收到的很棒的指针)我被困在工具的最后一个方面。

我基本上是在为我拥有超过 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 库):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并重建原始文件......)

______编辑_______

使用下面的建议,这是回溯:

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行)

4

2 回答 2

4

使用Base64

excessData.encode('base64')

.decode('base64')稍后通过简单的调用很容易将其转换回二进制数据。

Base64 编码为安全的 ASCII 数据,以合理紧凑的格式包含在 XML 中;每 3 个字节的二进制信息变成 4 个 Base64 字符。

于 2012-09-25T22:40:16.280 回答
1

要将原始字节转换为空格分隔的 ASCII 十六进制,您可以使用以下内容:

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

但是,正如其他答案中提到的那样,Base64 之类的东西可能会更高效,更容易使用。

于 2012-09-25T22:41:22.810 回答