我正在对二进制文件进行正则表达式搜索,我刚刚发现了一个问题,每隔一段时间就会使用一个64字节的校验和,这会引发我的搜索。我想知道的是;有没有办法忽略这些64字节,无论它们出现在我的数据中的什么位置?
我的正则表达式是\x18\xC0\x40[\x42\x43][\x00\x01]\x00\x00\x00
我的问题如下图所示;
0230000000FF45198085B918C0404301
FFFFFFFFFFFFFFFFC03CCFFFFFFFFFFF
FFFFFFFFFFFFFFFF3C0CFFFFFFFFFFFF
FFFFFFFFFFFFFFFF0300F0FFFFFFFFFF
FFFFFFFFFFFFFFFF030F0FFFFFFF4700
000000B9000000003C8085B9EDDF0000
在我的例子中,我的正则表达式(以粗体显示的值)显然不会选择我的模式匹配。这也可能发生在所需数据的任何一点。
对校验和数据的观察总是结束4700,它总是8个字节的FF,然后是3-4个字节的值,然后是4-5个字节的FF。
非常感谢任何帮助,谢谢 詹姆斯
答案 0 :(得分:2)
你应该使用两遍来进行搜索。在第一遍中,您删除所有这些校验和块,这应该很容易识别,在第二遍中您进行实际搜索。
否则,你必须在表达式的每个字母后面允许一个校验和块,导致一个很长很难阅读。
答案 1 :(得分:1)
\x18\xC0\x40[\x42\x43][\x00\x01][^\x00\x00\x00]*\x00\x00\x00
答案 2 :(得分:1)
试试这个:
\x18\xC0\x40[\x42\x43][\x00\x01](?:\x00{8}[\x00-\xFF]*?\x47\x00)\x00{3}
更新后,如果校验和无处不在,这将有效。为了便于阅读,我插入了换行符
\x18(?:\x00{8}[\x00-\xFF]*?\x47\x00)
\xC0(?:\x00{8}[\x00-\xFF]*?\x47\x00)
\x40(?:\x00{8}[\x00-\xFF]*?\x47\x00)
[\x42\x43](?:\x00{8}[\x00-\xFF]*?\x47\x00)
[\x00\x01](?:\x00{8}[\x00-\xFF]*?\x47\x00)
\x00(?:\x00{8}[\x00-\xFF]*?\x47\x00)
\x00(?:\x00{8}[\x00-\xFF]*?\x47\x00)
\x00