Diese Frage war für eine Weile da draußen und ich dachte, ich sollte einige Bonuspunkte anbieten, wenn ich es zur Arbeit bringen kann.
Kürzlich schrieb ich bei der Arbeit einen Parser, der eine Binärdatei in einem lesbaren Format konvertieren würde. Binärdatei ist keine Ascii-Datei mit 10101010
-Zeichen. Es wurde in Binärform codiert. Also wenn ich ein cat
für die Datei mache, bekomme ich folgendes -
Ich habe also das Dienstprogramm hexdump
verwendet, damit die Datei folgenden Inhalt anzeigt und in eine Datei umgeleitet wird. Jetzt hatte ich meine Ausgabedatei, die eine Textdatei mit Hex-Werten war.
Nach Tonnen von awk
, sed
und cut
konvertierte das Skript Hex-Werte in lesbaren Text. Um dies zu tun, benutzte ich die Offset-Positionierung, die die Anfangs- und Endposition jedes konvertierten Parameters markieren würde. Die resultierende Datei sieht nach der Konvertierung wie folgt aus:
Ich bin ein Testingenieur und die manuelle Validierung von Binärdateien war ein großer Schmerz. Ich musste die Offsets manuell analysieren und einen Taschenrechner verwenden, um sie zu konvertieren und gegen Wireshark und GUI zu validieren.
Ich möchte das Gegenteil von dem tun, was ich getan habe. Das war mein Plan -
Parameters : Values
haben würde. Die ersten drei Schritte sind abgeschlossen
Sobald mein Skript die Eingabetextdatei in eine Textdatei mit Hexadezimalwerten konvertiert, erhalte ich eine Datei wie folgt ( ich kann cat
darauf machen ).
Meine Absicht ist encoded diese konvertierte Datei in eine binary umzuwandeln, so dass ich, wenn ich cat
für die Datei mache, eine Menge von Garbage-Werten bekomme.
Also ist die Frage das. Wie kodiere ich es in dieser Form?
Wir haben nicht viele GTP-Nachrichten (GPRS Tunneling Protocol) in der Produktion. Ich dachte, wenn ich das umziehe, könnte ich effektiv einen Datengenerator erstellen und meine eigenen Daten erstellen.
Es mag zwar ausgeklügelte Werkzeuge geben, aber ich möchte nicht zu viel Zeit damit verbringen, sie zu lernen. Es ist ungefähr 2 Monate her, ich habe begonnen, an der * nix-Plattform zu arbeiten, und habe einfach die Werkzeuge wie sed
und awk
griffbereit.
Was ich will, ist Hilfe und Anleitung, um dies zu ermöglichen.
Nochmals vielen Dank für das Lesen! 200 Punkte warten auf jemanden, der mich in die richtige Richtung lenken kann. :)
Hier ist ein Beispiel für die ursprüngliche Binärdatei
Hier sehen Sie ein Beispiel für eine Eingabetextdatei , mit der der Benutzer Werte eingeben kann
Hier sehen Sie ein Beispiel für eine Datei , die mein Skript erstellt, nachdem die Konvertierung der Eingabetextdatei abgeschlossen ist.
Wie ändere ich die Codierung von File 3
in File 1
?
Sie können xxd verwenden, um in und aus Binärdateien / Hexdumps zu konvertieren ganz einfach.
Daten zu hex
%Vor%hex zu Daten
%Vor%oder
%Vor% Der -p
ist der Postscript-Modus, der eine freiere Eingabe ermöglicht.
Dies ist die Ausgabe von xxd -r -p text
, wobei text die Daten sind, die Sie oben angeben
Wenn Sie cut
und awk
verwenden, können Sie dies relativ einfach mit einer gawk
(GNU Awk) Erweiterungsfunktion, strtonum()
:
Oder wenn Sie eine Nicht-GNU-Version von 'new awk
' verwenden, können Sie Folgendes verwenden:
Wenn Sie andere Tools (Perl und Python sprint, Ruby wäre eine andere Möglichkeit) verwenden möchten, können Sie es einfach tun.
odx
ist ein ähnliches Programm wie das Programm hexdump
. Das obige Skript wurde modifiziert, um 'hexdump.out' als Eingabedatei zu lesen, und die Ausgabe wurde in odx
anstelle einer Datei ausgegeben und gibt die folgende Ausgabe aus:
Oder mit hexdump -C
anstelle von odx
:
Um die Kodierung von Datei3 zu Datei1 zu ändern, verwenden Sie ein Skript wie folgt:
%Vor%Oder, wenn Sie es nur pipen möchten, und verwenden Sie wie das xxd-Beispiel in diesem Thread:
%Vor%Wenn Sie wirklich BASH dafür verwenden wollen, dann schlage ich vor, dass Sie Array verwenden, um Ihr Paket schön aufzubauen. Hier ist der Startcode:
%Vor%Ausgabe:
%Vor%Sicher, das ist keine Lösung der ursprüngliche Post ... Die Lösung wird so etwas verwenden, um eine binäre Ausgabe zu generieren. Das größte Problem ist, dass wir die Feldtypen im Paket noch nicht kennen. Wir kennen auch nicht die Architektur (ist es Bigendian oder Littleendian, ist es 32bit oder 64bit). Sie müssen uns die Spezifikation geben. Für eine Instanz ist die Länge des Pakets welcher Art? Das wissen wir nicht aus dieser TXT-Datei!
Um Ihnen zu helfen, was Sie tun müssen, müssen Sie uns die Spezifikation über die Größe dieser Felder finden.
Beachten Sie, dass es ein guter Anfang ist. Sie müssen praktische Funktionen implementieren, um z. B. den Puffer [] automatisch mit Werten aus einer Zeichenfolge zu füllen, die mit Hexadezimalwerten codiert ist. Sie können also etwas wie write $offset "ff c0 d3 ba be"
machen.
Es gibt ein Tool binmake , das es erlaubt, einige Binärdaten im Textformat zu beschreiben und eine Binärdatei zu erzeugen (oder an stdout auszugeben). Es erlaubt das Endianess- und Zahlenformat zu ändern und akzeptiert Kommentare.
Erhalte und kompiliere zuerst binmake (das Binärprogramm wird in bin/
sein):
Erstellen Sie Ihre Textdatei file.txt
:
Generieren Sie Ihre Binärdatei file.bin
:
Sie können es auch mit stdin
und stdout
verschicken:
awk ist das falsche Werkzeug für den Job hier, aber es gibt tausend Möglichkeiten, es zu tun. Der einfachste Weg ist oft ein kleines C-Programm oder jede andere Sprache, die explizit zwischen einem Zeichen und einer Folge von Dezimalziffern unterscheidet.
Um dies jedoch in awk zu tun, verwenden Sie das "% c" printf-Format.
Tags und Links parsing bash binaryfiles hexdump xxd