Erstellen Sie Binärdateien in UNIX

8

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.

Was habe ich getan?

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 -

%Vor%

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.

%Vor%

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:

%Vor%

Warum habe ich es gemacht?

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.

Jetzt der Frageteil

Ich möchte das Gegenteil von dem tun, was ich getan habe. Das war mein Plan -

  • Haben Sie eine einfach zu lesende Textdatei, die Parameters : Values haben würde.
  • Der Benutzer kann einfach Werte daneben setzen (zB Date wäre ein Parameter und Benutzer kann ein Datum angeben, das die Datendatei haben soll).
  • Das Skript schneidet alle relevanten Informationen (vom Benutzer bereitgestellte Informationen) aus der Eingabetextdatei aus und konvertiert sie in Hexadezimalwerte.
  • Sobald die Datei in Hexadezimalwerte konvertiert wurde, möchte ich sie wieder in Binärcode codieren.

Die ersten drei Schritte sind abgeschlossen

Problem

Sobald mein Skript die Eingabetextdatei in eine Textdatei mit Hexadezimalwerten konvertiert, erhalte ich eine Datei wie folgt ( ich kann cat darauf machen ).

%Vor%

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.

%Vor%

Also ist die Frage das. Wie kodiere ich es in dieser Form?

Warum möchte ich das machen?

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.

Summiere die Dinge

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. :)

Beispieldateien

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 ?

    
jaypal singh 10.11.2011, 20:58
quelle

5 Antworten

14

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

%Vor%     
Iain 28.11.2011, 20:35
quelle
3

Wenn Sie cut und awk verwenden, können Sie dies relativ einfach mit einer gawk (GNU Awk) Erweiterungsfunktion, strtonum() :

tun %Vor%

Oder wenn Sie eine Nicht-GNU-Version von 'new awk ' verwenden, können Sie Folgendes verwenden:

%Vor%

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:

%Vor%

Oder mit hexdump -C anstelle von odx :

%Vor%     
Jonathan Leffler 27.11.2011 02:39
quelle
2

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.

    
DejanLekic 28.11.2011 20:07
quelle
1

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):

%Vor%

Erstellen Sie Ihre Textdatei file.txt :

%Vor%

Generieren Sie Ihre Binärdatei file.bin :

%Vor%

Sie können es auch mit stdin und stdout verschicken:

%Vor%     
daouzli 03.01.2017 21:30
quelle
0

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.

    
thiton 10.11.2011 21:03
quelle