我正在尝试编写一个小程序,它将搜索二进制文件中的几个字节,并用另一堆字节替换这些文件。但每次我尝试运行这个小应用程序时,我收到关于istream_iterator不可解除引用的消息。 也许有人有一个建议如何以另一种方式做到这一点(迭代器对我来说有点新主题)。修改二进制文件
#include <fstream>
#include <iterator>
#include <algorithm>
using namespace std;
int main() {
typedef istream_iterator<char> input_iter_t;
const off_t SIZE = 4;
char before[SIZE] = { 0x12, 0x34, 0x56, 0x78 };
char after[SIZE] = { 0x78, 0x12, 0x34, 0x65 };
fstream filestream("numbers.exe", ios::binary | ios::in | ios::out);
if (search(input_iter_t(filestream), input_iter_t(), before, before + SIZE) != input_iter_t()) {
filestream.seekp(-SIZE, ios::cur);
filestream.write(after, SIZE);
}
return 0;
}
这是我第二次尝试这样做,但也有一些错误。随着小文件看起来像工程确定,但更大(大约2MB)它工作非常缓慢,从来没有找到我正在寻找模式。
#include <iostream>
#include <cstdlib>
#include <string>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <windows.h>
using namespace std;
int main() {
const off_t Size = 4;
unsigned char before[Size] = { 0x12, 0x34, 0x56, 0x78 };
unsigned char after[Size] = { 0x90, 0xAB, 0xCD, 0xEF };
vector<char> bytes;
{
ifstream iFilestream("numbers.exe", ios::in|ios::binary);
istream_iterator<char> begin(iFilestream), end;
bytes.assign(begin, end) ;
}
vector<char>::iterator found = search(bytes.begin(), bytes.end(), before, before + Size);
if(found != bytes.end())
{
copy(after, after + Size, found);
{
ofstream oFilestream("number-modified.exe");
copy(bytes.begin(), bytes.end(), ostream_iterator<unsigned char>(oFilestream));
}
}
return 0;
}
干杯, 托马斯