바이너리 파일을 몇 바이트 검색하여 다른 바이트 묶음으로 바꾸는 작은 프로그램을 작성하려고합니다. 하지만 매번이 작은 응용 프로그램을 실행하려고하면 메시지가 나타납니다 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;
}
건배, 토마스