Python - 将原始二进制转储转换为ASCII HEX字节

时间:2012-09-25 22:35:09

标签: python binary ascii

继续这个问题:Handling and working with binary data HEX with 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 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行)

2 个答案:

答案 0 :(得分:4)

使用Base64

excessData.encode('base64')

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

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

答案 1 :(得分:1)

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

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

但是,正如其他答案中所提到的,像Base64这样的东西可能会更有效,更容易使用。