Comparaison binaire en C++
Que fait ce programme ?
Il fait une comparaison absolue (sans décalage de bits) entre
2 fichiers et renvoie le résultat sous forme fichier bitmap. La couleur
noir correspond à un bit de valeurs identiques, la couleur blanche à
un bit de valeurs différentes, et la couleur gris indique que l'un des
fichiers est déjà terminés.
Comment l'utilise-t-on ?
Il s'agit d'un programme msdos donc il s'utilise avec command.exe
ou à l'aide d'un fichier de tâches bat. + d'infos là
compare_bin.exe [fichier1] [fichier2] [largeur_image_comparative]
Source
#include [<]sstream>
#include [<]string>
#include [<]strstream>
#include [<]iostream>
using namespace std;
int compare_val(unsigned int length, long offset, unsigned int smaller,
ifstream& fi1, ifstream& fi2, ofstream& fo, int write_file)
{
char tampon1;
char tampon2;
int k=1;
if (write_file==1)
{
for (unsigned long j=0;j[<]length;j++)
{
fi1.seekg(j);
fi2.seekg(j);
fo.seekp(offset+length-j);
fi1.get(tampon1);
fi2.get(tampon2);
if (j>smaller) fo.put(3);
else if (tampon1==tampon2) fo.put(1);
else {
fo.put(2);
if (k==1) {
k=0;
cout [<][<] "Premiere divergence a l'offset " [<][<] j [<][<] endl;
}
}
}
}
else {
for (unsigned long j=0;j[<]length;j++)
{
fi1.seekg(j);
fi2.seekg(j);
fi1.get(tampon1);
fi2.get(tampon2);
if (j[<]=smaller)
if (tampon1!=tampon2) {
cout [<][<] "Premiere divergence a " [<][<] j;
break;
}
}
}
}
int filesize(char* filename)
{
ifstream fi(filename,ios::in|ios::binary);
fi.open(filename);
fi.seekg (0, ios::end);
int length = fi.tellg();
fi.close();
return length;
}
unsigned long puissance(int numb, int expo)
{
if (expo>0)
{
int nb_i=numb;
for(int j=0;j[<]expo-1;j++)
{
numb*=nb_i;
}
return numb;
}
else return 1;
}
int is_impair(int i) {
if (i%2==0) return 0;
else return 1;
}
// write_val(valeur,n_position,longeur,fichier_en_écriture)
int write_val(int val, int i, int length, ofstream& fo)
{
int reste;
for (int j=length-1;j>0;j--)
{
fo.seekp(j+i);
//cout [<][<] "
|" [<][<] i [<][<] "| Valeur : " [<][<] val;
reste=val%puissance(256,j);
//cout [<][<] "
" [<][<] " bloc "[<][<] j [<][<] " : " [<][<] (val-reste)/puissance(256,j) [<][<] " reste : " [<][<] reste;
fo.put((val-reste)/puissance(256,j));
val=reste;
//cout [<][<] "valeur : " [<][<] val;
}
fo.seekp(i);
fo.put(reste);
//cout [<][<] "
" [<][<] " bloc 0 : " [<][<] reste;
}
// get_val(n,len,fichier_à_lire)
// lit la valeur d'un bloc héxadécimal de longueur len à la position n
// dans un flux fihcier_à_lire
int get_val(unsigned long i, int length, ifstream& fi)
{
int result=0;
char tampon;
for (int j=0;j[<]length;j++)
{
fi.seekg(j+i);
fi.get(tampon);
unsigned long y=tampon;
if (y>255) y-=4294967040;
result+=y*puissance(256,j);
}
return result;
}
// copy_val()
int copy_val(unsigned long i, int length, ifstream& fi, ofstream& fo)
{
char tampon;
for (unsigned long j=i;j[<]length+i;j++)
{
fi.seekg(j);
fo.seekp(j);
fi.get(tampon);
fo.put(tampon);
}
}
int main(int argc, char* argv[])
{
int size1=filesize(argv[1]);
int size2=filesize(argv[2]);
int nb_fichiers=2;
int write_file=1;
// calcul du fichier de plus grande taille
int bigger, smaller;
if (size1[<]=size2) {bigger=size2; smaller=size1;}
if (size2[<]=size1) {bigger=size1; smaller=size2;}
char image[256];
char *pimage=image;
strcpy(pimage,argv[1]);
strcat(pimage,"_");
strcat(pimage,argv[2]);
strcat(pimage,".bmp");
ifstream fi1(argv[1],ios::in|ios::binary);
ifstream fi2(argv[2],ios::in|ios::binary);
ifstream model("bitmap",ios::in|ios::binary);
ofstream fo(pimage,ios::out|ios::binary);
// calcul de la hauteur
int width=atoi(argv[3]);
width=width+is_impair(width);
int height=(bigger-(bigger%width))/width;
int rectangle=width*height;
// pose de l'entête
long offset=get_val(10,4,model);
copy_val(0,offset,model,fo);
model.close();
write_val(width,18,4,fo);
write_val(height,22,4,fo);
compare_val(rectangle,offset,smaller,fi1,fi2,fo,write_file);
fi1.close();
fi2.close();
fo.close();
return 0;
}
?>