我正在尝试使用一个二进制文件的设置文件来找出它的结构,以便我可以从中获取有关文件位置等的一些信息。
据我所知,有趣的数据恰好在转义字符 b'\x03\SETTING' 之后或附近 - 这是我对“LQ”感兴趣的设置示例。
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
\x03HTAPp\x00\x00\x00\x02\x02\x00\x00\x01\x02L\x02\x00\x00\x00\x01
\x03LQ\x00\x00\x00\\\\Media\\Render_Drive\\mediafiles\\mxf\\k70255.2\\a08.56d829a7_56d82956d829a0.mxf
\x03HTAPp\\x00\x00\x00\x02\x02\x00\x00\x01\x02L\x02\x00\x00\x00\x01
\x03LQ\x00\x00\x00\\\\Media\\Render_Drive\\mediafiles\\mxf\\k70255.2\\a07.56d829a6_56d82956d829a0.mxf
所以看起来每个“句子”都以 \x03 开头 - 我在这里寻找的路径位于 LQ 设置 '\x03LQ' 之后的第 8 个字节
该文件还有我想要捕获的其他设置 - 每次看起来设置直接在转义字符之后,并由设置的简短描述和一些字节填充。
ATM 我正在读取二进制文件并且可以找到特定路径(仅当我知道现在有多长时)
with open(file, "rb") as abin:
abin.seek(0)
data = abin.read()
foo = re.search(b'\x03LQ', data)
abin.seek(foo.start() + 8) # cursor lands on 8th byte
eg = abin.read(32)
# so I get the path of some length as eg.....
这不是我想要的,因为我想读取整个字节串直到下一个转义字符,然后找到发生的下一个设置并读取路径。
我正在尝试使用 findall(),但它只返回一个相同的字节对象列表(似乎),我不明白如何搜索每个唯一路径和每个字节字符串的实例并从中读取数据中的某个光标位置。例如。
bar = re.findall(b'\x03LQ', data)
for bs in bar:
foo = re.search(bs, data)
abin.seek(foo.start() + 8)
eg = abin.read(64)
print('This is just the same path each time', eg)
指点一下任何人?
关键是看你的结果findall()
,这将是:
[b'\x03LQ', b'\x03LQ', b'\x03LQ', ...]
您只是告诉它找到一个静态字符串,因此它会返回所有内容。为了使结果有用,您可以告诉它改为捕获给定字符串之后的内容。这是一个示例,它将抓取给定字符串之后的所有内容,直到下一个\x03
字节:
findall(rb'\x03LQ([^\x03]*)', data)
括号告诉findall()
你想要匹配的哪一部分,[^\x03]*
意思是“匹配任意数量的不匹配的字节\x03
”。您的示例的结果应该是:
[b'\x00\x00\x00\\\\Media\\Render_Drive\\mediafiles\\mxf\\k70255.2\\a08.56d829a7_56d82956d829a0.mxf\n',
b'\x00\x00\x00\\\\Media\\Render_Drive\\mediafiles\\mxf\\k70255.2\\a07.56d829a6_56d82956d829a0.mxf']
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句