Vergleich von Binärdateien
Binärdateien können unzählige ineinander verschachtelte Elemente, Chunks und Blöcke enthalten. Dies macht es schwierig, Binärdateien auf einer Ebene zu vergleichen, die die Bedeutung der in den Dateien enthaltenen Eigenschaften und Werte berücksichtigt. Eine Möglicheit, dies dennoch zu tun, ist die Verwendung der Vergleichsfunktion des FileAnalyzers, die wir uns in diesem Tutorial näher ansehen möchten und mit der Sie verschiedene Arten von Binärdatei-Vergleichen durchführen können.
- Aufruf der Vergleichsfunktion
- Vergleich eines Elements mehrerer Dateien
- Vergleich von Elementen innerhalb einer Datei
- Vergleich einzelner Eigenschaften
- Ergebnis des Vergleichs speichern oder kopieren
- Vergleiche über die Skriptsteuerung automatisieren
Wichtig für alle in diesem Tutorial vorgestellten Vergleiche ist das Pfad-Konzept des FileAnalyzers, mit dem Sie beliebige Elemente und Chunks innerhalb der Struktur von Dateien eindeutig adressieren können. Falls Sie mit diesem Konzept noch nicht vertraut sind, sollten Sie zunächst die Einführung in das Pfad-Konzept des FileAnalyzers lesen.
Aufruf der Vergleichsfunktion
Sie können die Vergleichsfunktion des FileAnalyzers über verschiedene Wege aufrufen. Zum Beispiel finden Sie unter der Dateiliste im Hauptfenster einen Button mit dem Titel "Vergleichen", außerdem erreichen Sie den Vergleichsdialog über das Menü "Tools > Vergleich" oder über die Tastenkombination STRG + Q (von "KU" wie "K" wie "C"-ompare, da STRG + C schon belegt ist).
Am einfachsten ist es jedoch, den Vergleich direkt aus der Dateistruktur oder der Detailtabelle heraus zu starten. Klicken Sie dafür einfach mit der rechten Maustaste auf das Element innerhalb der Baumstruktur, das sie vergleichen möchten und wählen Sie "Pfad vergleichen" aus dem Kontextmenü oder machen Sie das gleiche mit der Detail-Tabelle rechts daneben, um einen Vergleich der darin gewählten Eigenschaften zu initiieren. Um mehrere Eigenschaften gleichzeitig miteinander zu vergleichen, können Sie in der Detailtabelle auch mehrere Eigenschaften auf einmal auswählen.
Mehr zu diesen unterschiedlichen Arten von Vergleichen erfahren Sie in den nächsten Abschnitten.
Vergleich eines Elements mehrerer Dateien
Wenn Sie von mehreren Dateien das jeweils gleiche Element beziehungsweise einen in all diesen Dateien vorkommenden Chunk über alle Dateien hinweg vergleichen möchten, können Sie dafür im FileAnalyzer folgendermaßen vorgehen:
- Fügen Sie als erstes alle Dateien, die Sie miteinander vergleichen möchten, zur Dateiliste im FileAnalyzer hinzu. Dafür können Sie die Dateien zum Beispiel einfach aus einem Ordner auf das Programm ziehen.
- Klicken Sie anschließend in der Dateiliste auf eine beliebige dieser Dateien, so dass diese Datei vom FileAnalyzer eingelesen wird und Sie unterhalb der Dateiliste die Struktur der Datei im Bereich "Dateistruktur" sehen können.
- Suchen Sie sich nun das Element beziehungsweise den Chunk innerhalb der Dateistruktur, den Sie mit den anderen Dateien vergleichen möchten, klicken Sie mit der rechten Maustaste auf dieses Element und wählen Sie "Pfad vergleichen" aus dem Kontextmenü. Falls es mehrere gleichnamige Pfade innerhalb Ihrer Datei gibt, wählen Sie stattdessen "Pfad an dieser Position vergleichen" (mehr dazu im nächsten Abschnitt).
Daraufhin öffnet sich der Vergleicher, in dem bereits das Ergebnis Ihres Vergleichs angezeigt wird. Jede Zeile der Ergebnistabelle entspricht einer Ihrer Dateien. Neben den Spalten für den Dateinamen, den Pfad und dem Byte-Offset (die Byte-Position) des gefundenen Elements innerhalb der Datei, finden Sie in der Ergebnistabelle eine Spalte für jede einzelne Eigenschaft des Elements, so dass Sie die verschiedenen Werte der gleichen Eigenschaft der verschiedenen Dateien untereinander vergleichen können (falls Sie nur eine oder einzelne dieser Eigenschaften in der Tabelle aufführen möchten, beachten Sie bitte den Abschnitt über den Vergleich einzelner Eigenschaften). Mit einem Klick auf den Spaltentitel kann die Tabelle nach dieser Spalte sortiert werden.
Alternativ können Sie auch einfach den zu vergleichenden Pfad im Vergleichsdialog oben in das Textfeld eingeben und rechts daneben auf den Button "Vergleichen" klicken. Wenn Sie zum Beispiel den Font Header einiger TTF- oder OTF-Schriften miteinander vergleichen möchten, geben Sie hier einfach den Pfad zum Font Header "/head" ein und Sie erhalten eine Vergleichstabelle aller Eigenschaften dieses Headers wie beispielsweise die Version oder die in diesem Chunk hinterlegten Schrifteigenschaften wie Bold, Italic, Underline oder Condensed, aufbereitet innerhalb einer Tabelle. In der gleichen Weise können Sie natürlich auch andere Pfade oder Dateien eines anderen Typs miteinander vergleichen.
Vergleich von Elementen innerhalb einer Datei
Der Vergleicher des FileAnalyzers lässt sich nicht nur zum Vergleichen mehrerer Dateien nutzen, sondern kann auch dafür verwendet werden, Elemente innerhalb einer Datei miteinander zu vergleichen. Sinn macht so ein Vergleich zum Beispiel, falls eine Datei mehrere Elemente des gleichen Typs enthält, wie zum Beispiel MP4-Videodateien mit sowohl einem Audio- als auch einem Video-TrackHeader oder Bilddateien, die mehrere unterschiedliche Bilder enthalten können, wie beispielsweise Icons (Windows ICO / macOS ICNS) oder GIF-Dateien.
Um diesen Vergleich von gleichartigen Elementen innerhalb einer Datei zu starten, können wir in einer ähnlichen Weise vorgehen wie beim Vergleich eines Elements mehrerer Dateien, den wir uns im letzten Abschnitt angesehen haben:
- Zuerst ziehen wir unsere Datei, die wir vergleichen möchten, wieder aus einem beliebigen Ordner auf den FileAnalyzer, so dass sie in der Dateiliste des Programms erscheint.
- Anschließend klicken wir in der Dateistruktur dieser Datei mit der rechten Maustaste auf das Element beziehungsweise den Pfad innerhalb der Struktur, den wir vergleichen möchten.
- Dieses Mal wählen wir jedoch "Pfad an allen Positionen vergleichen" und erhalten anschließend unser Vergleichsergebnis in einem neuen Fenster.
Für das eingangs erwähnte Beispiel einer GIF-Datei mit mehreren Bildern könnte dies zum Beispiel der Pfad "/image/imagedescriptor" für den Image Descriptor sein, der Informationen zu den Einzelbildern enthält. Bei Verwendung dieses Pfades würde unsere Ergebnistabelle eine Liste aller in der GIF-Datei enthaltenen Bilder erzeugen, die neben dem Byte-Offset des Bildes zum Beispiel auch die Breite und die Höhe des Bildes auflistet.
Pfad an allen versus nur an dieser Position vergleichen
Für den Vergleich der Elemente innerhalb einer Datei ist es wichtig, die Funktion "Pfad an allen Positionen vergleichen" zu wählen. Nur dies sorgt dafür, dass alle gleichnamigen Pfade innerhalb Ihrer Datei in den Vergleich aufgenommen werden. Es wird also gemäß dem Pfad-Modell unabhängig vom Index nach den Pfaden gesucht.
Alternativ finden Sie im Kontextmenü auch noch die Funktion "Pfad an dieser Position vergleichen". Diese Funktion ruft den Vergleicher unter Berücksichtigung der Indices des gewählten Pfades auf, das heißt es wird wirklich nur das Element in den Vergleich aufgenommen, das Sie angeklickt haben.
Wenn Sie zum Beispiel in Ihrer GIF-Datei auf das dritte Bild klicken und den Vergleich an "dieser Position" starten, können Sie das jeweils dritte Bild mehrerer GIF-Dateien miteinander vergleichen, ohne die anderen Bilder innerhalb der Dateien zu beachten. Der Pfad würde in diesem Fall "/image[2]/imagedescriptor" lauten (Image 2 für das dritte Bild, da die Zählung bei 0 beginnt), während mit dem Pfad "/image/imagedescriptor" ohne Nennung eines Indices alle Bilder innerhalb der Datei berücksichtigt würden.
Auch die Funktion "Pfad an allen Positionen vergleichen" lässt sich nicht nur mit einer Datei in der Dateiliste sondern auch mit mehreren Dateien aufrufen. In diesem Fall erhalten Sie einen Vergleich aller Elemente mit diesem Pfad nicht nur innerhalb einer Datei sondern zusätzlich auch über alle Dateien in Ihrer Dateiliste hinweg innerhalb einer Vergleichstabelle.
Vergleich einzelner Eigenschaften
Bisher haben wir uns nur den Vergleich von ganzen Elementen oder Chunks mitsamt aller ihrer Eigenschaften angesehen. Manchmal interessiert uns aber auch nur eine bestimmte Eigenschaft oder nur eine kleine Auswahl von Eigenschaften, insbesondere dann, wenn unsere Elemente sehr viele Eigenschaften enthalten (wie zum Beispiel unsere bereits erwähnten Schriftdateien oder auch Portable Executables wie EXE-Anwendungen oder DLL-Bibliotheken). Wie das funktioniert möchten wir uns in diesem Abschnitt ansehen.
Wir haben bereits erwähnt, dass wir im Vergleichsdialog oben in das Textfeld einen Pfad mit oder ohne Indices schreiben können, um alle in diesem Pfad gespeicherten Eigenschaften miteinander vergleichen zu können. Wenn wir den Vergleich dagegen nur auf einzelne Eigenschaften beschränken möchten, können wir diese getrennt mit einem Doppelpunkt anhängen:
/moov/trak/tkhd:Duration
Mit diesem Pfad können wir die Spieldauer von ISO Base Media File Format Dateien wie zum Beispiel M4A-Audios oder MP4-Videos auslesen, die in der Eigenschaft "Duration" im Pfad "/moov/trak/tkhd" gespeichert ist.
Mehrere Eigenschaften können wir dabei durch ein Komma trennen:
/sof0:ImageHeight,ImageWidth
Die Höhe und die Breite von JPG-Bildern sind in den Eigenschaften ImageHeight und ImageWidth im Pfad "/sof0" gespeichert. Starten wir unseren Vergleich mit diesem Aufruf, erhalten wir als Resultat eine Vergleichstabelle, die in je einer Spalte sowohl die Höhe als auch die Breite der miteinander verglichenen Bilder enthält, jedoch keine anderen Eigenschaften wie BitsPerPixel, die ebenfalls in diesem Pfad abgespeichert sind. Achten Sie dabei immer auf den korrekten Pfad und die korrekten Namen der Eigenschaften. Für PNG-Bilder wäre es zum Beispiel stattdessen der Pfad "/ihdr:Width,Height", da die Höhe und Breite hier einerseits im Image Header (ihdr) gespeichert sind und andererseits andere Namen als bei JPEG-Bildern verwendet werden.
Aufruf des Eigenschaftsvergleichs aus der Detailtabelle
Natürlich gibt es auch für den Vergleich einzelner Eigenschaften eine schnelle Aufrufmöglichkeit, damit Sie den Pfad nicht händisch eingeben müssen:
- Wählen Sie dazu zuerst das Element, in dem sich die Eigenschaft befindet, die Sie vergleichen möchten, aus der Dateistruktur aus.
- Dies führt dazu, dass die in diesem Element gespeicherten Eigenschaften in der Detailtabelle rechts daneben angezeigt werden.
- Klicken Sie nun mit der rechten Maustaste auf die Zeile der Detailtabelle, die Ihre zu vergleichende Eigenschaft enthält und wählen Sie "Eigenschaft im ausgewählten Pfad vergleichen" aus dem Kontextmenü.
- Dies öffnet dann direkt den Vergleichsdialog und führt den Vergleich für Ihre Eigenschaft im gewählten Pfad durch.
Natürlich lassen sich auf diese Weise nicht nur einzelne Eigenschaften auswählen, sondern auch mehrere gleichzeitig: Markieren Sie dafür einfach mit Hilfe der gedrückten Shift-Taste alle Zeilen aus der Detailtabelle, deren Eigenschaften Sie miteinander vergleichen möchten und wählen Sie anschließend "Eigenschaften im ausgewählten Pfad vergleichen" aus dem Kontextmenü. Dies führt dann automatisch zu einem Aufruf des Vergleichers mit all ihren gewählten Eigenschaften in der soeben erwähnten kommagetrennten Form.
Für gleichnamige Pfade stehen Ihnen, wie im letzten Abschnitt beschrieben, wieder die zwei Möglichkeiten "Eigenschaft im ausgewählten Pfad an dieser Position vergleichen" sowie "Eigenschaft im ausgewählten Pfad an allen Positionen vergleichen" zur Verfügung, womit Sie den Vergleich wieder entweder nur für dieses Element über mehrere Dateien hinweg oder für alle gleichnamigen Elemente innerhalb einer Datei durchführen können (letzteres ist zusätzlich natürlich auch unter Berücksichtigung mehrerer Dateien möglich).
Ergebnis des Vergleichs speichern oder kopieren
Wenn Sie das Ergebnis Ihres Vergleichs in anderen Anwendungen weiterverwenden oder als Datei speichern möchten, finden Sie dafür unter der Vergleichstabelle die drei Buttons "Kopieren als TSV", "Kopieren als CSV" sowie "Speichern als...":
- Kopieren als TSV: Mit diesem Button kopieren Sie die Ergebnistabelle als Tab Separated Values in Ihre Zwischenablage. Das heißt, die einzelnen Werte sind mit einem Tab voneinander getrennt und können so zum Beispiel in Programme wie Microsoft Excel, LibreOffice oder OpenOffice Calc kopiert werden.
- Kopieren als CSV: Diese Funktion funktioniert ähnlich, kopiert die Ergebnistabelle jedoch als Comma Separated Values in die Zwischenablage. Je nach Ihren Spracheinstellungen wird entweder das Komma oder das Semikolon als Feldtrennzeichen verwendet während als Zeilentrenner der System-Zeilenumbruch genutzt wird.
- Speichern als Datei: Neben dem Kopieren in die Zwischenablage ist über diesen Button auch eine Speicherung der Vergleichstabelle als Datei möglich. Über die Auswahlbox "Dateityp" des Speicherdialogs können Sie das Format für die Speicherung festlegen. Ihnen stehen die Formate CSV (Comma Separated Values), TSV (Tab Separated Values), XLSX (Microsoft Excel Spreadsheet), ODS (Open Document Spreadsheet), DIF (Data Interchange Format), HTML (Webseite) und TXT (Plain Text) zur Verfügung.
Vergleiche über die Skriptsteuerung automatisieren
Wie viele andere Funktionen des FileAnalyzers auch, kann auch die Vergleichsfunktion automatisiert und über Kommandozeilenparameter gesteuert werden. Damit lassen sich alle in diesem Tutorial vorgestellten Vergleiche nicht nur über die grafische Benutzeroberfläche des Programms sondern auch über Skripts oder aus anderen Programmen heraus aufrufen und durchführen.
Der dafür erforderliche Parameter namens "compare" wird zusammen mit zahlreichen Erläuterungen und Beispielen im Tutorial über die Skriptsteuerung des FileAnalyzers in den Abschnitten "Chunks mehrerer Dateien miteinander vergleichen", "Chunks innerhalb einer Datei miteinander vergleichen" sowie "Einzelne Eigenschaften mehrerer Dateien vergleichen" vorgestellt.