Eine Shell-ähnliche Umgebung für die binäre Verarbeitung

15

Diese Frage kam mir einige Male zuvor, jetzt als Antwort auf die Frage Durchschleifen von Binärdatenblöcken von stdin in Bash Answers unter /programming/993434/what-language-is-to-binary -as-perl-is-to-text waren auch nicht zufriedenstellend.

Ich suche nach einer Skriptumgebung, die speziell für die Verarbeitung von E / A mit Binärdateien geeignet ist. Ich weiß, dass ich eine der vollwertigen Programmiersprachen (c / Python / ...) verwenden kann, aber sie haben einen enormen Initialisierungs- und Codierungsaufwand (Zuweisung und Fread / Fwrite in c, Bitstrings in Python ...), ganz zu schweigen davon Sie eignen sich weniger für Skripterstellung (Aufrufen anderer Anwendungen). Perl ist nicht besser mit seinen unpackFunktionen, seiner stringorientierten Bedienung und seiner doofen Syntax.

Sowas od, aber als Sprache.

Was ich erwarte:

  1. Endianness mit einem einzigen Schalter / Befehl einstellen oder ändern.
  2. einfache Angabe des angeforderten Typs (so etwas wie bash Verlängerung read varmit int32 var, float varetc.).
  3. Behandlung von Binär-Through-Pipes, Überspringen der angegebenen Anzahl von Bytes.
  4. Standard-Scripting-Ablaufsteuerung (für / if / ...), an die wir gewöhnt sind.

Ich möchte Rohdaten (Fotografie, wissenschaftliche Daten, unbekannte und schlecht dokumentierte Formate) mit der gleichen Leichtigkeit und Einsicht verarbeiten, die Sie beim Überprüfen von ASCII-Dateien erhalten. Ich verwende cjetzt, aber es ist nicht optimal für Ad-hoc-Skripte und kann nicht interaktiv sein.

Kennt jemand ein solches Tool? Keine klickende GUI-Software, bitte, es muss über ssh, von anderen Skripten usw. funktionieren. "Existiert nicht" ist eine akzeptable, aber deprimierende Antwort.

orion
quelle
2
Es nimmt nicht den Schmerz der Startzeit weg, aber ich finde die Bytes von Python 3.3 zusammen mit Plumbum sehr praktikabel: chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()Haben Sie sich das angesehen?
Anthon
Sie können den C-Code, den Sie jetzt haben, in eine Reihe von Befehlszeilentools umwandeln, die Sie in einem Bash-Skript verwenden können. Eine Shell-Variable kann zwar nicht binär sein, Sie können sie jedoch in Named Pipes ('fifo') speichern. Ihr Inhalt bleibt im Speicher, bis Sie ihn lesen möchten.
Goldlöckchen
1
Es ist ein schwerwiegender Fehler in Ihrer Argumentation WRT Python und Perl, BTW. Während einzelne Kommandozeilen-Tools kompiliert werden, sind Shell-Skripte nicht so umfangreich und erfordern viel Forking (wenn Sie teuer sein möchten, ist es Forking). Ihre Diskussion, andere Fragen usw. implizieren, dass Sie in Ordnung wären, wenn Sie bash hier verwenden würden, wenn es mit Binärdateien umgehen könnte. Python und Perl - Skripte sind sowohl vorkompilierte. Wenn Sie ein relativ komplexes Python- oder Perl-Skript mit einem parallelen Bash-Skript vergleichen, ist Perl oder Python eine Größenordnung schneller . Wenn Sie mir nicht glauben, können Sie gerne im Internet nach gegenteiligen Beweisen suchen.
Goldlöckchen
Ich bin nicht auf der Suche nach einem Tool, das schnell läuft, sondern nach etwas, das ich schnell codieren kann . Wenn ich zum Beispiel ein seltsames Programm habe, das ein binäres int für die Array-Größe der nachfolgenden Strukturen (int, float, float) ausgibt, möchte ich die Array-Größe schnell lesen und das Array in einer Schleife durchlaufen und möglicherweise einige davon berechnen kumulativ oder maximal von einigen Komponenten, oder drucken Sie nur eine Komponente als ASCII-Spalte für die Gnuplot-Verarbeitung. Anthon: Danke, ich wusste nichts davon, es wird nützlich sein. Goldlöckchen: Ich versuche das zu vermeiden, aber ich kann am Ende nur mein eigenes Werkzeug schreiben :)
orion
2
Klingt so, als ob Sie ein Tutorial zur Verwendung von perl's unpack(ᵔᴥᵔ)
Stéphane Chazelas

Antworten:

2

Ich habe seit Jahren genau dasselbe Problem wie Sie.

Für einfache nicht interaktive Anwendungen verwende ich gerne den Binärblockeditor BBE . BBE ist zu binär wie SED zu Text, einschließlich seiner archaischen Syntax und Einfachheit. Es fehlen jedoch viele Funktionen, die ich oft benötige, sodass ich sie mit anderen Tools kombinieren muss. BBE ist also nur eine Teillösung. Beachten Sie auch, dass BBE seit Jahren keine Updates oder Verbesserungen mehr hat.

Natürlich kann man die Daten xxdvor und xxd -rnach dem Bearbeiten mit textbasierten Werkzeugen verwenden, aber das funktioniert nicht, wenn die fraglichen Daten groß sind und ein wahlfreier Zugriff erforderlich ist, beispielsweise beim Verarbeiten von Blockgeräten.

(Hinweis: Für Windows gibt es mindestens die teure, proprietäre WinHex-Skriptsprache, die uns jedoch nicht weiterbringt.)

Für kompliziertere binäre Bearbeitungen greife ich normalerweise auch auf Python zurück, obwohl es für große Dateien manchmal zu langsam ist, was der Hauptnachteil ist. Ich hoffe, Pyston (Python, das LLVM zum Kompilieren von optimiertem Maschinencode verwendet) wird eines Tages ausgereift genug sein, um verwendet werden zu können, oder noch besser, jemand wird eine kostenlose kompakte, schnelle und vielseitige Skriptsprache für die binäre Verarbeitung entwerfen und implementieren, für die AFAIK nicht existiert U * IX-ähnliche Systeme.

AKTUALISIEREN

Ich verwende zufällig auch den Homebrew, Open Source Intel x86 Assembler Flat Assembler , oder kurz FASM, der sich zu viel mehr als nur einem Assembler entwickelt hat.

Es verfügt über einen leistungsstarken Textblock-basierten Makro-Präprozessor (selbst eine aufregende vollständige Sprache) mit einer Syntax in der Tradition der Borland Turbo Assembler-Makrosprache, die jedoch wesentlich weiter fortgeschritten ist.

Außerdem verfügt es über eine Datenbearbeitungssprache, die es ermöglicht, beliebige Dateien binär einzuschließen, alle Arten von binären und arithmetischen Manipulationen (nur Ganzzahlen) zur "Kompilierungszeit" durchzuführen und das Ergebnis in eine Ausgabedatei zu schreiben. Diese Datenbearbeitungssprache hat Kontrollstrukturen und ist auch vollständig.

Es ist viel einfacher zu benutzen, als ein Programm zu schreiben, das eine binäre Manipulation in C und wahrscheinlich sogar in Python ausführt. Außerdem wird es unglaublich schnell geladen, da es sich um eine kleine ausführbare Datei handelt, die fast keine externen Abhängigkeiten aufweist (Es gibt zwei Versionen: Entweder wird nur libc benötigt, oder es kann als statische ausführbare Datei direkt auf dem Linux-Kernel ABI ausgeführt werden).

Es hat einige Rüschenkanten, wie

  1. Parallelität wird nicht unterstützt

  2. Wenn Sie in einer 32-Bit-x86-Assembly schreiben (funktioniert jedoch auf x86_64), benötigen Sie wahrscheinlich qemu oder einen ähnlichen Emulator, wenn Sie es auf etwas anderem als x86 oder x86_64 ausführen möchten

  3. Die leistungsstarke Makro-Präprozessorsprache ist vollständig. Das bedeutet, Sie sollten Erfahrung mit Sprachen wie Lisp, Haskell, XSLT oder wahrscheinlich M4 haben.

  4. Alle Daten, die in die Ausgabedatei geschrieben werden sollen, werden in einem "flachen" Puffer im Speicher abgelegt, und dieser Puffer kann wachsen, aber nicht schrumpfen, bis die Ausgabedatei geschrieben und fasm beendet wurde. Dies bedeutet, dass man nur Dateien erzeugen kann, die höchstens so groß sind, wie Sie in einem einzigen Durchlauf von fasm Hauptspeicher übrig haben.

  5. Daten können nur in eine einzige Ausgabedatei für jeden Durchlauf von fasm geschrieben werden

  6. Ja, es ist Homebrew, eine wirklich nette und clevere

Franki
quelle
2

Sie müssen nicht unbedingt mit Perls Entpacken "Frieden schließen" ... eines der großartigen Dinge an Perl ist, wie Sie die Parser- und Symboltabelle missbrauchen können, um Ihre eigene Sprache in einem benutzerdefinierten Paket zu erstellen.

Ist das im Grunde das, wonach du suchst?

use MyBinLib;
my $struct= struct(
  pack => 8,
  size => 400,
  fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
  printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}

Die Übung besteht dann darin, genug Perl zu lernen, um das MyBinLib-Paket zu schreiben. Fragen Sie in einem Perl-Forum nach und die Leute würden sich wahrscheinlich freuen, Ihnen zu helfen.

M Conrad
quelle
1

Sind Sie auf beavMakros gestoßen, aber ich konnte keine Skripte finden,

apt-cache show beav Extrakt :

Mit beav können Sie eine Datei in den Formaten HEX, ASCII, EBCDIC, OCTAL, DECIMAL und BINARY bearbeiten. Sie können Daten im FLOAT-Modus anzeigen, aber nicht bearbeiten. Sie können in jedem dieser Modi suchen oder suchen und ersetzen. Daten können in den Formaten BYTE, WORD oder DOUBLE WORD angezeigt werden. Während der Anzeige von WORDS oder DOUBLE WORDS können die Daten in der Byte-Reihenfolge von INTEL oder MOTOROLA angezeigt werden. Daten beliebiger Länge können an beliebiger Stelle in die Datei eingefügt werden. Die Quelle dieser Daten kann die Tastatur, ein anderer Puffer oder eine Datei sein. Alle angezeigten Daten können im angezeigten Format an einen Drucker gesendet werden. Dateien, die größer als der Arbeitsspeicher sind, können verarbeitet werden.

Dann gibt es xxdwelche, die in den / aus dem binären / ASCII-Anzeigemodus konvertieren und mit sedoder kombiniert werden können vi, aber nicht über die Funktion zum Austauschen von Bytes verfügen.

X Tian
quelle
0

Sie können sich immer für das Gold entscheiden und in C oder ASM einsteigen. Wenn Sie mit rohen Binärdateien arbeiten, hüpfen Sie sie einfach direkt aus dem Register. Du bist schon da'.

Brad
quelle