查找二进制文件中字节序列的所有匹配项
Find all occurrences of a byte sequence in a binary file
请帮助我了解如何使用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;
}
相关文章:
- 程序错误地读取了二进制文件的一个字节
- 查找二进制文件中字节序列的所有匹配项
- 将Protobuf字节类型存储在二进制文件中
- 如何以快速速度将二进制文件分为C 或Python的6字节块
- 从二进制文件中保存的 4 字节双精度读取 8 字节双精度
- C :如何从二进制文件中读取特定数量的字节并将其保存到UINT16_T
- 将"8 bit"(字节)字符串写入二进制文件?
- 在不使用Ignore()读取二进制文件(C++)时忽略N个字节
- fstream从二进制文件的末尾删除n个字节
- 如何从不同部分读取二进制文件的var?(例如,2个字节,另一个位置有2个字节?)
- 读取并输出二进制文件(C++)中位置的字节
- 在写入二进制文件时,“std::ofstream::write”有时会写入超出应有字节数的字节
- 霍夫曼压缩读取文件不会复制二进制文件c++中的所有字节
- 从二进制文件读取/写入十六进制字节
- 正在尝试读取4字节无符号整数的二进制文件并转换为伏特
- 从二进制文件中逐个读取字节
- 正在从二进制文件中读取字节
- 在写入二进制文件时,ofstream::write写入的字节数超过了应有的字节数
- istream_iterator,用于遍历二进制文件中的字节
- 用C++读取包含空字节的二进制文件