0

この質問に加えて:Pythonを使用したバイナリデータHEXの処理と操作 (そして私が受け取った素晴らしいポインターのおかげで)私はツールの最後の側面に固執しています。

私は基本的に、EOFマーカーを超えたデータを含むファイルのクリーナーを作成しています。この余分なデータは、一部の検証ツールに失敗することを意味します。余分なデータを取り除く必要があるので、それらはバリデーターに提示されますが、このデータを捨てたくありません(実際、私はそれを保持する必要があります...)

データと他のいくつかの来歴/監査タイプの値を保持するためのXMLコンテナーを作成しましたが、生のバイナリとファイルに「ベイク」できるものとの間をエレガントに移動することに(まだ)固執しています。

例:

jpgファイルは(16進エディタビュー)で終わります 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から、(elementTree libを介して)ストリップされたデータをXMLに書き込もうとします。changeString.text =str(excessData)

もちろん、XMLライターは、バイナリダンプではなくASCIIを記述しようとしているため、これは機能しません。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)上記の場合、有効なASCII文字ではないため、エラーが表示されます。

したがって、私の質問は、この生データを将来保存して使用できるように、どのようにエレガントに処理するかということです。(次に、クリーンなファイルとXMLを取得して、元のファイルを再構築できる「uncleaner」を作成する予定です...)

______編集_______

以下の提案を使用して、これはトレースバックです。

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 は、XML に含めるのに安全な ASCII データに、適度にコンパクトな形式でエンコードします。バイナリ情報の 3 バイトごとに 4 つの Base64 文字になります。

于 2012-09-25T22:40:16.280 に答える
1

生のバイトをスペースで区切られた ASCII 16 進数に変換するには、次のようなものを使用できます。

>>> 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 に答える