在PHP中搜索二进制文件中的字节序列?

Alb*_*ana 5 php optimization search

我想使用PHP在二进制文件中找到特定的字节序列.我用十六进制表示这个序列,以避免输入太多的0和1.要找到的序列是0x4749524f.这是我现在提出的工作解决方案:

$mysequence = "4749524f";
$f = fopen($filename, "r") or die("Unable to open file!");
while(!feof($f)){
    $seq = fread($f, 4);
    if(bin2hex($seq) == $mysequence){
        echo "found!";
        break;
    }
    else if(!feof($f)) fseek($f, -3, SEEK_CUR);
}
Run Code Online (Sandbox Code Playgroud)

算法的作用很简单:

  1. 读4个字节
  2. 检查它们是否等于序列
  3. 如果他们是平等的 - >找到了!停止执行.
  4. 如果它们不等于且我不在文件的末尾,请将3字节返回到文件中并重复步骤1.

为什么我要回3个字节​​?因为如果这是文件的内容:

0000 4749 524f 0000 01b0 0013
Run Code Online (Sandbox Code Playgroud)

如果我没有回到3字节,我将0000 4749在第一次迭代,524f 0000第二次,01b0 0013第三次读取,你可以看到我错过了序列.

问题:它像地狱一样缓慢......应用程序必须使用最大50MB的文件,因此需要永远找到这个序列.

PHP中是否有一个优化的功能可以完成这项工作?这样做有更快(不像我的笨)的方式吗?

Jon*_*n M 1

从磁盘读取总是需要很长时间。您不能指望磁盘缓存。那是操作系统的事情。相反,可以说是进行您自己的“缓存”。读取一长串字节,大约 1M(或更多)。这减少了磁盘读取。然后在内存中搜索。读取接下来的 1Mbytes 时,请务必在其前面添加前一组的最后 3 个字节。搜索每组直到找到。读取的实际大小需要在 RAM 使用和磁盘读取之间取得平衡。