Springe zum Hauptinhalt

vim und xxd

Den Texteditor Vim kennen die meisten Linux-Nutzer, jedenfalls jene, die des öfteren auch mal auf der Kommandozeile arbeiten. Das Programm xxd dürfte hingegen deutlich weniger Nutzern bekannt sein. Wie man beide Programme kombinieren kann, um binäre Daten zu bearbeiten, darum soll es in diesem Blogbeitrag gehen.

Vim ist ein sog. modaler Texteditor, der in praktisch allen Linuxdistributionen zu finden ist, aber auch für diverse andere Betriebssysteme erhältlich ist. Vim läuft im Textmodus auf jedem Terminal und wird über die Tastatur gesteuert.

xxd wird auf seiner manpage mit dem Satz make a hexdump or do the reverse beschrieben. Es handelt sich also um ein Programm zur Anzeige des Hexdumps von Daten, welches aber offensichtlich auch die Rückumwandlung von Hexdumps in eine binäre Form beherrscht. Die besagte manpage von xxd enthält auch folgende Warnung:

The tools weirdness matches its creators brain. Use entirely at your own risk. Copy files. Trace it. Become a wizard.

Um nun beide Programme zur Bearbeitung binärer Daten zu kombinieren, bietet sich folgendes Vorgehen an:

  • Öffnen der Binärdatei mit vim -b example.bin

  • Aus Vim heraus xxd mit dem Kommando %!xxd aufrufen

  • Änderungen müssen zwingend im mittleren Abschnitt einer Zeile, dem eigentlichen Hexdump stattfinden, also dem Block aus 16 Oktetten

    00000000: 5249 4646 40a8 e309 4156 4920 4c49 5354  RIFF@...AVI LIST

    In diesem Ausschnitt dürfen Änderungen also nur im Bereich 5249 4646 40a8 e309 4156 4920 4c49 5354 vorgenommen werden.

  • Im letzten Schritt werden die geänderten Daten mit %!xxd -r in den Dateipuffer zurückgeschrieben. Mit :wq wird dann die Datei geschrieben und Vim beendet.

Für große Dateien ist diese Vorgehensweise allerdings sehr ineffizient. Hier bietet es sich an, außerhalb von Vim zu arbeiten und xxd mit dd zu kombinieren.

Das nachfolgende Beispiel zeigt, wie die Kombination von xxd und dd aussehen könnte.

echo -n "2020" | \
xxd -r -p | \
dd of="file.bin" bs=1 seek="$((0x10))" conv=notrunc status=none

In diesem Beispiel werden zwei Leerzeichen am Offset 10 (Hexadezimal) in die Datei file.bin geschrieben.