我是python的新手,并且在发布之前尝试过寻求帮助。
我有二进制文件,其中包含我需要解析的许多值。每个值都有一个两个字节的十六进制标头和一个第三个字节,它给出了要解析的记录中数据的大小。以下是一个例子:
\x76\x12\x0A\x08\x00\x00\x00\x00\x00\x00\x00\x00
\x76\x12
是记录标记,\x0A
是下一个要读取的字节数。
此数据始终具有两个字节标记和第三个字节大小。但是,要解析的数据是可变的,记录标记的增量如下:\x76\x12
和\x77\x12
依此类推,直到\x79\x12
再次开始。
这只是使用此帖子的示例数据。
非常感谢您的帮助或指示。
答案 0 :(得分: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'
答案 1 :(得分: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)