繁体   English   中英

使用C或C ++在大型二进制文件中查找模式?

[英]Finding pattern in large binary file using C or C++?

我有一个~700 MB的二进制文件(非文本数据); 我想要做的是搜索整个文件中随机位置发生的特定字节模式。 例如0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 ,依此类推50个左右的字节。 我要搜索的模式是两个随机字节的序列,每两个字节出现0x55。

也就是说,搜索存储在文件中的表,其中0x55是分隔符,然后保存表中包含的数据或以其他方式操纵它。

最好的选择是简单地一次遍历每个字节,然后向前看两个字节以查看值是否为0x55,如果是,则再次向前看以确认该位置是否存在于该位置?

加载整个东西? FSEEK? 缓冲区块,一次搜索那一个字节?

查看这个大文件,并使用C或C ++查找模式的最佳方法是什么?

对于正则表达式匹配器或确定性有限自动机来说,这听起来很棒。 这些是高功率工具,旨在满足您的需求,如果您拥有它们,那么您可以毫不费力地进行此类搜索。 在C ++中,考虑查看Boost.Regex库,它应该具有解决此问题所需的所有功能。

最终对我有用的是Boyer-Moore-Horspool算法(由Jerry Coffin建议)和我自己的基于表结构和存储数据的算法之间的混合。

基本上,BMH算法捕获了我正在寻找的大部分内容。 显而易见的事情。

但有些表确实有奇怪的格式,我不得不实现一个半智能搜索,它会查看每个0x55后的数据,并弄清楚它是否可能是好的数据,或者只是随机的垃圾。

奇怪的是,我最终用PHP而不是C ++实现它,并将结果直接转储到MySQL数据库中进行查询。 搜索过程只花了大约5分钟或更短时间,结果非常好。 我最终得到了大量的垃圾数据,但它抓住了我需要它的所有内容,并且(据我所知)并没有留下任何好的数据。

加载整个东西? FSEEK? 缓冲区块,一次搜索那一个字节?

如果您可以将整个内容加载到内存中,则应该使用平台提供的内存映射功能。 这样,操作系统可以决定是否应该将文件的大部分保留在物理内存中(即系统目前有大量的空闲RAM),或者它是否应该只在较小的块中工作。

当然,这只适用于您可以将文件放入工作集中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM