0

我是 python 新手,并在发布之前尝试过寻求帮助。

我有包含许多我需要解析的值的二进制文件。每个值都有一个包含两个字节的十六进制标头和第三个字节,它给出了该记录中要解析的数据的大小。下面是一个例子:

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

\x76\x12是记录标记,是\x0A接下来要读取的字节数。

此数据始终具有两个字节标记和第三个字节大小。然而,要解析的数据是可变的,并且记录标记按如下方式递增:\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']

然后,您可以遍历您感兴趣的值,并在需要时将它们转换为十进制:

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 回答