查找二进制文件中字节序列的所有匹配项

Find all occurrences of a byte sequence in a binary file

本文关键字:二进制文件 字节 查找      更新时间:2023-10-16

请帮助我了解如何使用std::search在二进制文件中获取所有出现的{0x00,0x00,0x00,0x01}。

下面的代码找到第一个匹配项:

std::string NAL = "x00x00x00x01";
std::ifstream source("somedata.dat", std::ios::binary);
std::istream_iterator<unsigned char> begin(source), end, currNAL;
currNAL = std::search(begin, end, NAL.begin(), NAL.end());

我不明白如何在一段时间循环中使用std::search

由于 std::search(( 返回并迭代到第一个匹配项,因此您可以将第一次出现作为再次搜索的(非包容性(起点。

while(currNAL != source.end()){
currNAL = std::search(++currNAL, end, NAL.begin(), NAL.end());
//Increment some counter here?
}

我应该注意这是未经测试的代码,我并不是说这是针对您的确切问题的确切解决方案,只是演示了这个想法。

下面是一个完整的示例,显示了如何使用搜索来查找使用vector的所有实例。这些想法仍然适用于您的案例,您只是使用istream_iterator而不是vector迭代器。

#include <vector>
#include <iterator>
#include <iostream>
#include <algorithm>
int main()
{
std::vector<unsigned char> vec(500);
for(int i=0; i < 500; i++)
vec[i] = static_cast<unsigned char>(i % 100);
std::vector<unsigned char> pattern { 'A', 'B' };
auto start = vec.begin();  // start searching a beginning
while ( (start = std::search(start, vec.end(), pattern.begin(), pattern.end())) != vec.end()) {
std::cout << "Found at index: " << std::distance(vec.begin(), start) << std::endl;
start++;     // Search after this match on next iteration
}
return 0;
}