Obtenez la différence entre les fichiers binaires en utilisant vcdiff

tortoise.jpg tortoise_bad.jpg


J'en avais besoin pour comprendre où et comment le fichier JPEG a été corrompu pendant le transfert.


VCDIFF - format et algorithme pour le codage delta. Décrit dans la RFC 3284 .

Encodage delta (Encodage delta Eng) - une façon de représenter les données sous la forme de la différence (delta) entre les données série au lieu des données elles-mêmes.

Par exemple, j'utilise des fichiers texte encodés dans Windows-1251 pour plus de clarté. Mais avec le même succès, il peut s'agir de fichiers binaires.


Sources:


"  " ( source.txt ) "  " ( target.txt ) 

Vous devez faire la différence entre les fichiers:


 "  " ( source.txt -> target.txt ) "  " ( target.txt -> source.txt ) 

J'utilise le programme xdelta3, mais je pense que celui qui fonctionne avec le format vcdiff fera l'affaire.


Comment arriver


Nous aurons besoin d'un autre fichier rempli d'espaces:


 " " ( spaces.txt ) 

Il doit être plus grand ou égal en taille au fichier source (source.txt)


Équipe:


 xdelta3 -e -A -n -s source.txt target.txt | xdelta3 -d -s spaces.txt 

Résultat:


   

Drapeaux utilisés:
-e - crée un delta
-A - supprime les en-têtes en excès
-n - supprime crc (il ne permet pas d'utiliser le delta avec une autre source)
-s [] - la source avec laquelle le fichier cible est comparé et restauré
-d - récupère le fichier cible du delta et de la source


Comment ça marche


Si vous exécutez la commande:


 xdelta3 -e -A -n -s source.txt target.txt | xdelta3 printdelta 

Ensuite, après tous les en-têtes, nous verrons les commandes VCDIFF


  Offset Code Type1 Size1 @Addr1 + Type2 Size2 @Addr2 000000 025 CPY_0 9 S@0 000009 010 ADD 9 000018 025 CPY_0 9 S@14 

Le format VCDIFF est intrinsèquement très simple. Il se compose de 3 équipes.


COPY - copie les données d'une source ou d'une cible
ADD (add) - écrit les données stockées dans le delta dans le fichier cible (dont les données uniques ne sont pas dans la source)
RUN (répétition) - répète un octet du delta un nombre spécifié de fois


Delta stocke uniquement des données uniques et copie le reste de la source. Si vous exécutez la commande:


 xdelta3 -e -A -n -s source.txt target.txt > target.vcdiff 

On ne verra dans le delta que le mot "modifications" qui n'est que dans le fichier cible


 D0A6D093D094200102011720131B2009 0302190D0A19200E 

( JSON n'aime pas les caractères spéciaux, je les ai donc traduits en HEX )


Si le delta est appliqué sur la source (source.txt), alors nous obtenons le fichier cible (target.txt)


 xdelta3 -d -s source.txt target.vcdiff    

En remplaçant la source (source.txt) par un fichier rempli d'espaces (espaces.txt), nous avons remplacé les données qui sont répétées dans la source et dans le fichier cible par des espaces.


 xdelta3 -d -s spaces.txt target.vcdiff  

Vous pouvez utiliser n'importe quel autre caractère dans le fichier espaces.txt. La condition principale est que le fichier espaces.txt soit plus grand ou de taille égale au fichier source.


En fait, j'ai comparé des fichiers JPEG comme celui-ci:


 xdelta3 -e -A -n -s bad_image.jpg good_image.jpg | xdelta3 -d -s spaces.txt 

Le résultat de la comparaison de ces fichiers:


Afficher le résultat
  F488A2 F2AB 

Beaucoup d'espaces et d'octets "battus". Octets incorrects transférés vers HEX.


Testez les fichiers jpeg sur lesquels vous pouvez tester les méthodes de comparaison:


aimant tortoise.jpg (18 821 b)aimant tortoise_bad.jpg (18 829 b)
tortoise.jpgtortoise_bad.jpg

 xdelta3 -e -A -n -s tortoise_bad.jpg tortoise.jpg | xdelta3 -d -s spaces.txt 

Le résultat de la comparaison de ces fichiers:


Afficher le résultat
  F1BF F0B786 F39BAF F3BD94 

Octets incorrects transférés vers HEX.

Source: https://habr.com/ru/post/fr419883/


All Articles