Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C或C+在大型二进制文件中查找模式+;?_C++_C_File_Search_Design Patterns - Fatal编程技术网

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

C++ 使用C或C+在大型二进制文件中查找模式+;?,c++,c,file,search,design-patterns,C++,C,File,Search,Design Patterns,我有一个约700 MB的二进制文件(非文本数据);我想做的是搜索在整个文件中随机位置出现的特定字节模式。e、 g.0x?0x?0x55 0x?0x?0x55 0x?0x?0x55 0x?0x?0x55以此类推,以50字节左右的顺序排列。我要搜索的模式是两个随机字节的序列,每两个字节出现0x55 也就是说,搜索存储在以0x55为分隔符的文件中的表,然后保存表中包含的数据或以其他方式对其进行操作 最好的选择是一次只检查一个字节,然后向前看两个字节,看看值是否为0x55,如果是,再向前看一次又一次,确

我有一个约700 MB的二进制文件(非文本数据);我想做的是搜索在整个文件中随机位置出现的特定字节模式。e、 g.
0x?0x?0x55 0x?0x?0x55 0x?0x?0x55 0x?0x?0x55
以此类推,以50字节左右的顺序排列。我要搜索的模式是两个随机字节的序列,每两个字节出现0x55

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

最好的选择是一次只检查一个字节,然后向前看两个字节,看看值是否为0x55,如果是,再向前看一次又一次,确认该位置存在一个表吗

把所有东西都装进去?看?缓冲区块,一次搜索一个字节


什么是最好的方法来浏览这个大文件,找到模式,用C或C++?< /p> < p>这听起来像是一个伟大的工作,匹配或A。这些是专为满足您的要求而设计的高性能工具,如果您拥有它们,您在进行此类搜索时应该不会遇到太多麻烦。在C++中,考虑查看库,它应该具有所有需要解决这个问题的功能。 把所有东西都装进去?看?缓冲区块,一次搜索一个字节

如果您可以将整个内容加载到内存中,那么您可能应该使用平台提供的内存映射功能。通过这种方式,操作系统可以决定是将文件的大部分保存在物理内存中(即系统目前有大量可用RAM),还是只在较小的内存块中工作


当然,这只有在你能将文件放入工作集中时才有效。

最终对我有效的是Boyer-Moore-Horspool算法(由Jerry Coffin提出)和我自己的基于表结构和存储数据的算法的混合

基本上,BMH算法捕获了我要查找的大部分内容。显而易见的东西

但是有些表确实有奇怪的格式,我必须实现一个半智能搜索,它将查看每个
0x55
后面的数据,并确定它是否可能是好数据,或者只是随机垃圾


奇怪的是,我最终在PHP中实现了它,而不是C++,并把结果直接放到MySQL数据库中进行查询。搜索过程只花了大约5分钟或更少的时间,结果基本不错。我最终得到了很多垃圾数据,但它捕获了我需要的所有数据,而且(据我所知)没有留下任何好数据。

对于一个单字节搜索字符串来说,DFA不是有点过分吗?如果没有DFAs或regex引擎,以线性方式实现搜索是微不足道的。@Billy ONeal-也许我误解了上面的问题,但这看起来不像是在寻找一个字节(它在寻找一个特定的字节模式)。“我错了吗?”莫伦:如果那些是显示停止问题,你需要检查C++是否是正确的语言。@ ByyyNoal:不,搜索是微不足道的,以O(N*M)的方式实现。或者,换句话说,非正则表达式、非DFA、朴素的解决方案将花费大约50倍的时间,因为搜索字符串大约有50个字节长。@笨蛋:有时候你真的有钉子,你应该用锤子。正则表达式是专门为字符串中的模式匹配而设计的。您需要一些东西来找到模式,唯一的问题是您将使用什么外部库(regex或其他),或者您将如何自己编写它。随机字节是不同的还是特定字节的所有重复?这个随机字节可以是0x55吗?这是一次性的还是您必须搜索几个700Mb文件以查找相同的模式?您希望看到多少个0x55?0x55之间的两个字节可以是任何内容,包括0x55。有几十个表,所以0x55将在整个文件中重复多次。@Jerry Coffin:据我所知(我没有随身携带该文件),并非所有的表都是相同大小的。然而,我不记得曾经见过一个小于50字节左右的。换句话说,我不知道最小大小必须是多少,但我至少可以说,不会有少于10-20个条目的表(即,以0x55分隔的10-20对字节)。@Kyle Lowry:在这种情况下,我会使用类似Boyer Moore Horspool的变体。从第20和第21字节开始。如果两者都不是0x55,则向前移动20个字节,依此类推。