J'essaye d'écrire un petit programme qui va chercher un fichier binaire pour quelques octets et les remplacer par un autre paquet d'octets. Mais chaque fois que j'essaie d'exécuter cette petite application, j'ai reçu un message à propos de istream_iterator n'est pas dereferenceable. Peut-être que quelqu'un a une suggestion sur la façon de le faire d'une autre manière (les itérateurs sont un peu un nouveau sujet pour moi).Modification de fichiers binaires
#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;
}
Ceci est ma deuxième tentative de le faire, mais aussi quelque chose ne va pas. Avec de petits fichiers, ça a l'air de fonctionner correctement mais avec un gros (environ 2 Mo) ça marche très lentement et ne trouve jamais de motif ce que je cherche.
#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;
}
Cheers, Thomas