Holen Sie sich den Unterschied zwischen Binärdateien mit vcdiff

tortoise.jpg tortoise_bad.jpg


Ich brauchte dies, um zu verstehen, wo und wie die JPEG-Datei während der Übertragung beschädigt wurde.


VCDIFF - Format und Algorithmus für die Delta-Codierung. Beschrieben in RFC 3284 .

Delta-Codierung (Eng. Delta-Codierung) - eine Möglichkeit, Daten in Form der Differenz (Delta) zwischen seriellen Daten anstelle der Daten selbst darzustellen.

Zum Beispiel verwende ich aus Gründen der Übersichtlichkeit in Windows-1251 codierte Textdateien. Bei gleichem Erfolg können dies jedoch Binärdateien sein.


Quellen:


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

Sie müssen den Unterschied zwischen den Dateien ermitteln:


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

Ich benutze das Programm xdelta3, aber ich denke, jeder, der mit dem vcdiff-Format arbeitet, wird es tun.


Wie komme ich?


Wir benötigen eine weitere Datei mit Leerzeichen:


 " " ( spaces.txt ) 

Es muss größer oder gleich groß sein wie die Quelldatei (source.txt).


Team:


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

Ergebnis:


   

Verwendete Flaggen:
-e - Erstelle ein Delta
-A - entfernt überschüssige Header
-n - entfernt crc (es erlaubt nicht, das Delta mit einer anderen Quelle zu verwenden)
-s [] - Die Quelle, mit der die Zieldatei verglichen und wiederhergestellt wird
-d - -d die Zieldatei aus Delta und Quelle ab


Wie funktioniert es?


Wenn Sie den Befehl ausführen:


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

Nach allen Headern sehen wir dann die VCDIFF-Befehle


  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 

Das VCDIFF-Format ist von Natur aus sehr einfach. Es besteht aus 3 Teams.


COPY - kopiert Daten von einer Quelle oder einem Ziel
ADD (Hinzufügen) - Schreibt im Delta gespeicherte Daten in die Zieldatei (eindeutige Daten befinden sich nicht in der Quelle).
RUN (wiederholen) - Wiederholt ein Byte aus dem Delta eine bestimmte Anzahl von Malen


Delta speichert nur eindeutige Daten und kopiert den Rest von der Quelle. Wenn Sie den Befehl ausführen:


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

Wir werden im Delta nur das Wort "Änderungen" sehen, das nur in der Zieldatei enthalten ist


 D0A6D093D094200102011720131B2009 0302190D0A19200E 

( JSON mag keine Sonderzeichen, deshalb habe ich sie in HEX übersetzt. )


Wenn das Delta auf die Quelle (source.txt) angewendet wird, erhalten wir die Zieldatei (target.txt).


 xdelta3 -d -s source.txt target.vcdiff    

Durch Ersetzen der Quelle (source.txt) durch eine mit Leerzeichen gefüllte Datei (space.txt) haben wir die Daten, die in der Quell- und in der Zieldatei wiederholt werden, durch Leerzeichen ersetzt.


 xdelta3 -d -s spaces.txt target.vcdiff  

Sie können jedes andere Zeichen in der Datei space.txt verwenden. Die Hauptbedingung ist, dass die Datei space.txt größer oder gleich groß wie die Quelldatei ist.


Eigentlich habe ich JPEG-Dateien wie folgt verglichen:


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

Das Ergebnis des Vergleichs dieser Dateien:


Ergebnis anzeigen
  F488A2 F2AB 

Viele Leerzeichen und Bytes, die "geschlagen" wurden. Ungültige Bytes an HEX übertragen.


Testen Sie JPEG-Dateien, an denen Sie Vergleichsmethoden testen können:


Magnet tortoise.jpg (18 821 b)Magnet 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 

Das Ergebnis des Vergleichs dieser Dateien:


Ergebnis anzeigen
  F1BF F0B786 F39BAF F3BD94 

Ungültige Bytes an HEX übertragen.

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


All Articles