我正在嘗試編寫一個小程序,它將搜索二進制文件中的幾個字節,並用另一堆字節替換這些文件。但每次我嘗試運行這個小應用程序時,我收到關於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;
}
乾杯, 托馬斯