我尝试使用二进制文件的设置文件来了解它是如何被构造的,这样我就可以从中获取有关文件位置等的一些信息。
据我所知,这些有趣的数据要么完全在逃避字符之后,要么接近转义字符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设置后的第8个字节' \ x03LQ'
该文件还有我想要捕获的其他设置 - 每次看起来设置都是在转义字符后面,并通过设置的短描述和一些字节来填充。
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.....
这不是我想要的,因为我想读取整个bytestring直到下一个转义字符,然后找到下一个发生的设置并读取路径。
我正在尝试使用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)
指点任何人?
答案 0 :(得分:1)
关键是要查看findall()
的结果,这将是:
[b'\x03LQ', b'\x03LQ', b'\x03LQ', ...]
你只是告诉它找到一个静态字符串,这样它才能返回。为了使结果有用,您可以告诉它取代在给定字符串之后的内容。这是一个示例,它将获取给定字符串之后的所有内容,直到下一个\x03
字节为止:
findall(rb'\x03LQ([^\x03]*)', data)
parens告诉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']