0

私はPythonが初めてで、投稿する前にヘルプを検索しようとしました.

解析する必要がある多数の値を含むバイナリ ファイルがあります。各値には、2 バイトの 16 進ヘッダーと、解析するレコード内のデータのサイズを示す 3 番目のバイトがあります。次に例を示します。

\x76\x12\x0A\x08\x00\x00\x00\x00\x00\x00\x00\x00

\x76\x12レコード マーカーで\x0Aあり、次に読み取るバイト数です。

このデータには、常に 2 バイトのマーカーと 3 番目のバイト サイズがあります。ただし、解析されるデータは可変であり、レコード マーカーは次のように増加\x76\x12\x77\x12ます\x79\x12

これは、この投稿を使用するための単なるサンプル データです。

ヘルプやポインタをありがとう。

4

2 に答える 2

1

このようなものが欲しいですか?

>>> b = b'\x76\x12\x0A\x08\x00\x00\x00\x00\x00\x00\x00\x00'
>>> from StringIO import StringIO
>>> io = StringIO(b)
>>> io.seek(0)
>>> io.read(2) #read 2 bytes, maybe validate?
'v\x12'
>>> import struct
>>> nbytes = struct.unpack('B',io.read(1))
>>> print nbytes
(10,)
>>> data = io.read(nbytes[0])
>>> data
'\x08\x00\x00\x00\x00\x00\x00\x00\x00'
于 2013-06-25T12:31:52.830 に答える
0

これにより、データが生の文字列として扱われます (「\」エスケープ文字を無視してリストに分割するため)

a = r"\x76\x12\x0A\x08\x00\x00\x00\x00\x00\x00\x00\x00".split('\\')
print a

出力: ['', 'x76', 'x12', 'x0A', 'x08', 'x00', 'x00', 'x00', 'x00', 'x00', 'x00', 'x00', 'x00']

次に、関心のある値を繰り返し処理し、必要に応じてそれらを 10 進数に変換できます。

for i in range(len(a[4:])): # cutting off records before index 4 here
    print int(str(a[i+4][1:]),16)
于 2013-06-25T12:44:04.460 に答える