Wie kann man drei Binärdateien vergleichen, um nur anzuzeigen, was sich zwischen 1 und 2 geändert hat und was sich dann zwischen 2 und 3 wieder geändert hat?

Wie kann man drei Binärdateien vergleichen, um nur anzuzeigen, was sich zwischen 1 und 2 geändert hat und was sich dann zwischen 2 und 3 wieder geändert hat?

Ich habe drei Binärdateien (Speicherauszüge). Nennen wir sie file1, file2, file3. Ich versuche, eine Software zu debuggen und lege dabei einen Schalter um.

  • file1= ausschalten

  • file2= einschalten

  • file3= ausschalten

Ich muss wissen, welche Bytes sich zwischen file1und geändert haben file2, welche sich dann auch file1in wieder auf die gleichen Werte (wie ) geändert haben file3.

Es gibt viele unabhängige Änderungen zwischen file1, file2sodass diffmir das allein nicht ausreicht, um zu bestimmen, was sich ändert, wenn ich diesen Schalter umlege. Ich versuche, die eindeutigen Entropiebytes zu identifizieren, die sich von file1, 2, 3, … ändern.

Ich weiß, dass es Tools wie xxd, diff, vimdiff, gibt colordiff. Ich bin mir nur nicht sicher, wie ich sie für dieses Problem am besten einsetzen kann.

Antwort1

file1Um die zwischen und geänderten Bytes file2und ihre jeweiligen Werte zu erfahren, verwenden Sie cmp -l:

cmp -l file1 file2 > changes12

Gleiches gilt für file3und file2. Der Trick besteht darin, immer in die gleiche Richtung zu untersuchen (hier: von aus auf an schalten), deshalb schreibe ich file2ans Ende:

cmp -l file3 file2 > changes32

Nun sind identische Änderungen zu finden:

comm -12 changes12 changes32

und die Ausgabe sieht wie folgt aus (Beispiel):

     1629 152 112

was bedeutet, dass das Byte 1629(Dezimal, Nummerierung beginnt mit 1) von 152(Oktal) in 112(Oktal) geändert wurde.


Anmerkungen:

  • cmp -lin meinem Ubuntu wird die Ausgabe in Spalten aufgeteilt. Das bedeutet, dass Zeilen mit führenden Leerzeichen gedruckt werden können. Die Breite der ersten Spalte hängt von der Eingabegröße ab. Ich vermute, dass einige Implementierungen dies nicht tun. Es gibt einige Bedenken:
    • Wenn die Originaldateien unterschiedliche Größen haben (was bei Ihnen wahrscheinlich nicht der Fall ist), cmpkann eine Datei eine breitere erste Spalte erzeugen als die andere. Im Kontext von später commist das nicht akzeptabel. Sie können die Ausgabe „entspalten“, indem Sie sie an weiterleiten awk '{print $1" "$2" "$3}'.
    • Wenn die Ausgabe nicht „spaltenweise“ ist (oder „entspaltenweise“ ist), commkann es sein, dass die Dateien nicht sortiert sind. Sie müssen sort(nicht sort -n) bevor Sie speichern changesAB. Dies kann zu einer etwas unerwarteten Reihenfolge führen (z. B. werden unterschiedliche Bytes 23angezeigt).nachabweichendes Byte 100453), was behoben werden kann, indem die Ausgabe von comman weitergeleitet wird sort -n.
  • changes*Dateien können riesig sein. Sie sind vorübergehend und temporär, daher kann Prozesssubstitution ein guter Ansatz sein. Dies ist jedoch nicht POSIX:

    # Korn shell syntax example
    comm -12 <(cmp -l file1 file2) <(cmp -l file3 file2)
    
  • Die Ausgabe von commkann mit einer weiteren und einer weiteren Ausgabe von verwendet werden, cmpum unabhängige Änderungen besser herauszufiltern:

    comm -12 changes12 changes32 > result1
    cmp -l file4 file5 | comm -12 - result1 > result2
    cmp -l file6 file5 | comm -12 - result2 > result3
    

    Aber erinnere dich:


Dokumentation:

Antwort2

Ich bin ein Windows-Benutzer und verwende Beyond Compare seit vielen Jahren zum Vergleichen von Dateien, unter anderem um drei Dateien (jeweils zwei) miteinander zu vergleichen.

Es scheint, dass Beyond Compare auch eine Linux-Distribution hat, also schauen Sie sich diese vielleicht an.

https://www.scootersoftware.com/download.php?zz=kb_linux_install

Ich weiß, dass die Windows-Version Optionen zum Anzeigen nur der Unterschiede sowie viele andere Funktionen bietet, die Ihnen möglicherweise weiterhelfen. Ich kann mich nicht erinnern, ob sie einen Drei-Wege-Vergleich haben oder nicht.

Ich bin weder in der Entwicklung noch im Vertrieb für sie tätig, mir gefällt die Software einfach sehr gut.

Antwort3

Basierend auf der Antwort von Kamil habe ich Folgendes verwendet, um das zu bekommen, was ich brauchte:

cmp -l Datei1 Datei2 | awk '{print $1" "$2" "$3}' | sort > Änderungen_12

cmp -l Datei3 Datei2 | awk '{print $1" "$2" "$3}' | sort > Änderungen_32

comm -12 Änderungen_12 Änderungen_32 > allgemeine_Änderungen

verwandte Informationen