Skin utilisée

TimeSwitch

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; } ?>