【发布时间】:2011-02-18 22:35:35
【问题描述】:
我有一个约 700 MB 的二进制文件(非文本数据);我想做的是搜索在整个文件中随机位置出现的特定字节模式。例如0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 0x? 0x? 0x55 依此类推,按顺序排列 50 个左右字节。我要搜索的模式是两个随机字节的序列,每两个字节出现 0x55。
即以0x55为分隔符搜索文件中存储的表,然后保存表中包含的数据或进行其他操作。
最好的选择是简单地一次遍历每个单独的字节,然后向前看两个字节以查看值是否为 0x55,如果是,则一次又一次地向前看以确认表存在在那个位置?
加载整个东西?寻找?缓冲块,一次搜索一个字节?
使用 C 或 C++ 查看这个大文件并找到模式的最佳方法是什么?
【问题讨论】:
-
随机字节是不同的还是特定字节的所有重复?这个随机字节可以是 0x55 吗?这是一次性的,还是您必须搜索多个 700Mb 文件才能找到相同的模式?
-
您希望看到多少个 0x55?
-
0x55 之间的两个字节可以是任何值,包括 0x55。有几十个表,因此 0x55 将在整个文件中重复多次。
-
@Jerry Coffin:据我所知(我的 atm 没有文件),并非所有表格的大小都相同。但是,我不记得曾经见过小于 50 字节左右的文件。换句话说,我不知道最小大小是多少,但我至少可以说不会有少于 10-20 个条目的表(即 10-20 对以 0x55 分隔的字节)。跨度>
-
@Kyle Lowry:在这种情况下,我会使用类似 Boyer-Moore-Horspool 的变体。从第 20 个和第 21 个字节开始。如果它们都不是 0x55,则再向前移动 20 个字节,依此类推。
标签: c++ c file search design-patterns