IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Comparer deux images disque


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Par défaut Comparer deux images disque
    Bonjour,

    Je souhaiterais écrire un code capable de comparer deux grandes images disque dd (par exemple 150Go), et générer un rapport txt sur les différences trouvées : de telle adresse à telle adresse les valeurs hexas sont différentes.

    L'idéal serait de le faire avec une interface graphique qui montre l'avancement du style gtk. Est-ce faisable ? Je peux aussi envisager un script bash ou python ?

    J'ai vu qu'en C il faudrait ouvrir les fichiers avec fopen en mode rb, mais est-ce que ca marche aussi avec des gros fichiers de 150GB ? Il y a pas de manière d'utiliser des stream et avancer gentiment dans le fichier ?

    Merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Bonjour,

    Oui, c'est faisable facilement, mais tu peux déjà commencer par

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    $ cmp -bl image1 image2 | tee differences.log

    … si tu veux gagner du temps.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Par défaut
    Merci pour la réponse.

    En fait j'ai deux semaines devant moi pour faire un truc propre avec barre de progression. Je ne pense pas pouvoir récupérer l'avancement de la tâche depuis cette commande par exemple chaque 3-4 sec, avec en plus un formatage du txt bien précis. Du coup je me lance avec fopen, fseek etc, c'est la bonne approche "facile" ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par Sylphide666 Voir le message
    j'ai deux semaines devant moi pour faire un truc propre avec barre de progression. Je ne pense pas pouvoir récupérer l'avancement de la tâche depuis cette commande par exemple chaque 3-4 sec, avec en plus un formatage du txt bien précis. Du coup je me lance avec fopen, fseek etc, c'est la bonne approche "facile" ?
    Si, si. C'est tout-à-fait possible sans trop de difficultés mais, effectivement, c'est encore plus simple de faire un programme qui lit le tout directement. fopen() a le mérite de fonctionner partout mais si tu veux faire des comparaisons de gros fichiers sous UNIX, j'utiliserais plutôt mmap().

    Sache enfin que faire un programme de comparaison octet à octet est assez facile, mais faire un outil tel que diff est plus subtil : si des octets ont été insérés ou supprimés dans l'une ou l'autre de tes images, alors c'est tout le reste de l'image qui sera marquée comme invalide.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Par défaut
    Voilà j'ai un peu attaqué avec fopen finalement. Il y a juste un petit truc que j'ai pas très bien compris.

    Quand on fait un fread avec sizeof(char) et un buffer de 1, il chope bien un caractère dans le fichier binaire ? Parce qu'un caractère dans le binaire correspond à un hexa sur 4 bits... donc il faudrait que le buffer soit de 2 pour avoir un byte ?

    Je mets à disposition mon début de code pour ceux que ca intéresse : http://paste.org/pastebin/view/35716

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Parce qu'un caractère dans le binaire correspond à un hexa sur 4 bits... donc il faudrait que le buffer soit de 2 pour avoir un byte ?
    Comment ça ?

    Concernant ton code, il y a plusieurs choses qui ne vont pas :

    * La fonction feof indique simplement, lorsqu'une fonction de lecture a échoué, si cet échec a eu lieu à cause du fait que la fin du fichier a été atteinte. Tu ne dois donc pas utiliser cette fonction dans ta boucle pour tester la fin de fichier : tu dois utiliser la valeur retour des fonctions de lecture, qui sont faites (notamment) pour cela.

    * strcmp est une fonction permettant de comparer des chaines de caractères. Ce n'est pas le cas ici. Ca ne marchera donc pas. De plus, tu utilises cette fonction pour comparer deux buffers de... 1 octet chacun.

    * Il faut utiliser la valeur retour de fread pour connaitre le nombre d'octets qui ont été lus. En effet, il se peut qu'une erreur ou une fin de fichier se produise au cours de la lecture. Notamment, si la fonction renvoie 0, cela veut dire qu'un problème a eu lieu : soit une fin de fichier soit une autre erreur.

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Par défaut
    Salut jeroman,

    Merci pour tes remarques, voilà quelques corrections. Je ferai des conditions plus complètes pour les erreurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while (1) {
    		read1 = fread(buffer1, sizeof(char), BUFFERSIZE, f1);
    		read2 = fread(buffer2, sizeof(char), BUFFERSIZE, f2);
    		if (read1==0) {
    			break;
    		}
    		pos += BUFFERSIZE;
    		//comparer les buffers
    		if (memcmp(buffer1, buffer2, BUFFERSIZE)) {
    Mon but est effectivement de comparer octet par octet, on est d'accord que ca correspond à 2 valeurs hexa (puisque 1 byte = BUFFERSIZE = 8 bits = 2 x 4 bits =? 1 char en c).

    En fait je me base par rapport à la commande hexdump -C d'une image qui me sort une série de valeurs hexa. L'objectif est donc de comparer 2 hexa voisins à la fois. Le problème c'est qu'on tombe souvent sur des "00" qui font qu'il y a plein d'intervalles trouvés...

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Mon but est effectivement de comparer octet par octet, on est d'accord que ca correspond à 2 valeurs hexa (puisque 1 byte = BUFFERSIZE = 8 bits = 2 x 4 bits =? 1 char en c).
    Un char en C est toujours et par définition d'une taille de 1 byte. Le fait d'utiliser 2 caractères pour afficher sa valeur ne change rien à la chose.
    Ici, tu lis les données en binaire, chacune fait un byte et tu compares directement 2 bytes. Il n'y a pas à considérer "2 hexa voisins" .

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Par défaut
    En prenant 1 byte (char) à fois et en le convertissant en notation hexa par la fonction sprintf() et "%X" en paramètre, j'obtiens bien les 2 hexa voisins de 4 bits chacun que je veux comparer. Problème résolu, merci à tous

Discussions similaires

  1. Comparer deux images (100% identiques ou non)
    Par FluidBlow dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/04/2008, 13h40
  2. Comparer deux images
    Par GwenZephyr dans le forum Windows Forms
    Réponses: 6
    Dernier message: 04/03/2008, 16h09
  3. comparer deux images en vbnet
    Par offspring dans le forum VB.NET
    Réponses: 9
    Dernier message: 06/11/2007, 14h13
  4. comparer deux images
    Par alex01pernot dans le forum Delphi
    Réponses: 4
    Dernier message: 03/04/2007, 16h08
  5. Comparer deux images pas directement superposables
    Par Byhias dans le forum Images
    Réponses: 2
    Dernier message: 12/03/2007, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo