Frage

Ich bin auf der Suche nach einem Scripting (oder höher Level-Programmierung) Sprache (oder zB Module für Python oder ähnliche Sprachen) für mühelos die Analyse und Manipulation von binären Daten in Dateien (zB Core-Dumps), ähnlich wie Perl erlaubt Textdateien manipulierte sehr glatt .

Dinge, die ich tun möchte, beliebige Stücke in verschiedenen Formen der Daten umfassen präsentiert (binär, dezimal, hex), konvertieren Daten von einem Endianess zum anderen, usw. Das heißt, Dinge, die Sie normalerweise C oder Assembler verwenden würde, aber ich suche nach einer Sprache, die für hochspezifische, einmalige Zwecke sehr schnell zum Schreiben kleine Stücke von Code ermöglicht.

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

  

Dinge, die ich tun möchte, beliebige Stücke in verschiedenen Formen der Daten umfassen präsentiert (binär, dezimal, hex), konvertieren Daten von einem Endianess zum anderen, usw. Das heißt, Dinge, die Sie normalerweise C oder Assembler verwenden würde, aber ich suche nach einer Sprache, die für hochspezifische, einmalige Zwecke sehr schnell zum Schreiben kleine Stücke von Code ermöglicht.

Nun, während es kontraintuitiv erscheinen mag, fand ich erlang extrem gut geeignet für diese, und zwar durch seine starke Unterstützung für pattern-Matching , auch für Bytes und Bits (die so genannten „ Erlang Bit Syntax "). Das macht es sehr einfach, auch sehr anspruchsvolle Programme zu erstellen, die mit Kontrolle und Manipulation von Daten auf einem byte- beschäftigen und sogar auf einer Bit-Ebene:

  

Seit 2001 ist die funktionale Sprache Erlang mit einem Byte-orientierten Datentyp kommt (so genannte binäre) und mit Konstrukten Muster auf einem binären Anpassung zu tun.

Und zitieren informIT.com :

  

(Erlang) Pattern Matching beginnt wirklich zu bekommen   Spaß, wenn sie mit dem binären kombiniert   Art. Betrachten Sie eine Anwendung,   empfängt Pakete von einem Netzwerk und   dann verarbeitet sie. Die vier Bytes in   ein Paket könnte eine Netzwerk-Byte-Reihenfolge sein,   Pakettypkennung. In Erlang, Sie   würde nur ein einziges process brauchen   Funktion, die in diese umwandeln könnte   eine Datenstruktur für interne   wird bearbeitet. Es würde sich etwas   wie folgt aus:

processPacket(<<1:32/big,RestOfPacket>>) ->
    % Process type one packets
    ...
;
processPacket(<<2:32/big,RestOfPacket>>) ->
    % Process type two packets
    ...

Also, erlang mit seinem integrierten Unterstützung für Mustererkennung und eine funktionale Sprache ist ziemlich ausdrucksvoll ist, siehe zum Beispiel der Umsetzung von ueencode in erlang:

uuencode(BitStr) ->
<< (X+32):8 || <<X:6>> <= BitStr >>.
uudecode(Text) ->
<< (X-32):6 || <<X:8>> <= Text >>.

Eine Einführung finden Sie unter Bitlevel Binaries und Generalized Comprehensions in Erlang . Sie können auch einige der folgenden Hinweise prüfen wollen:

Andere Tipps

Der Python bitstring Modul wurde für diesen Zweck geschrieben. Damit können Sie willkürliche Scheiben von binären Daten nehmen und bietet eine Reihe von verschiedenen Interpretationen durch Python Eigenschaften. Es gibt auch eine Vielzahl von Werkzeugen zum Erstellen und binäre Daten zu ändern.

Zum Beispiel:

>>> from bitstring import BitArray, ConstBitStream
>>> s = BitArray('0x00cf')                           # 16 bits long
>>> print(s.hex, s.bin, s.int)                       # Some different views
00cf 0000000011001111 207
>>> s[2:5] = '0b001100001'                           # slice assignment
>>> s.replace('0b110', '0x345')                      # find and replace
2                                                    # 2 replacements made
>>> s.prepend([1])                                   # Add 1 bit to the start
>>> s.byteswap()                                     # Byte reversal
>>> ordinary_string = s.bytes                        # Back to Python string

Es gibt auch Funktionen für bitweise Lesen und Navigation im bitstring, ähnlich wie in Dateien; in der Tat kann diese direkt aus einer Datei durchgeführt werden, ohne dass es in den Speicher einzulesen:

>>> s = ConstBitStream(filename='somefile.ext')
>>> hex_code, a, b = s.readlist('hex:32, uint:7, uint:13')
>>> s.find('0x0001')         # Seek to next occurence, if found
True

Es gibt auch Ansichten mit unterschiedlichen Endianess sowie die Fähigkeit endianness zu tauschen und vieles mehr - werfen Sie einen Blick auf die

Hier finden Sie aktuelle Python bitstring , es sieht wie genau das, was Sie wollen:)

Ich bin mit 010 Editor Binärdateien der ganzen Zeit sehen binäre Dateien anzuzeigen. Es ist vor allem darauf ausgerichtet mit binären Dateien zu arbeiten.

Es hat ein einfaches c-ähnliche Skriptsprache verwenden, um binäre Dateien zu analysieren und sie in eine sehr lesbaren Art und Weise zu präsentieren (wie ein Baum, Felder, die durch farbcodiert, wie das Zeug) .. Es gibt einige Beispielskripte ZipFiles und bmpfiles zu analysieren.

Immer wenn ich ein binäres Dateiformat erstellen, habe ich immer ein kleines Skript für 010 Editor machen die Dateien anzuzeigen. Wenn Sie einige Header-Dateien mit einigen structs haben, für binäre Dateien einen Leser macht, ist eine Sache von Minuten.

All High-Level-Programmiersprache mit pack / auspacken Funktionen zu tun. Alle 3 Perl, Python und Ruby kann es tun. Es ist Sache des persönlichen Geschmacks. Ich schrieb in jedem von diesen ein wenig binären Parsing und fühlte, dass Ruby war am einfachsten / eleganteste für diese Aufgabe.

Warum nicht ein C-Interpreter benutzen? Ich habe sie immer mit Schnipsel zu experimentieren, aber man konnte ein Skript etwas verwenden, wie Sie ohne allzu viel Mühe zu beschreiben.

Ich habe immer gern EiC . Es war tot, aber das Projekt in letzter Zeit wieder belebt wurde. EiC ist überraschenderweise in der Lage und ziemlich schnell. Es gibt auch CINT . Beide können für verschiedene Plattformen kompiliert werden, obwohl ich glaube, CINT Cygwin unter Windows benötigt.

Pythons Standardbibliothek hat einige von dem, was Sie benötigen - die Array Modul in insbesondere können Sie einfach Teile von binär-Dateien lesen, Swap-Endian, etc; der struct Modul ermöglicht eine feinere Interpretation von binären Strings. Aber weder ist ganz so reich, wie Sie benötigen: beispielsweise die gleichen Daten wie Bytes oder Halbworte zu präsentieren, müssen Sie es zwischen zwei Arrays kopieren (die numpy Drittanbieter-Add-on ist viel leistungsfähiger für den gleichen Bereich des Speichers auf verschiedene Weise zu interpretieren), und zum Beispiel gibt es einige Bytes in hex angezeigt nichts ist viel " gebündelt“über eine einfache Schleife oder Liste Verständnis wie [hex(b) for b in thebytes[start:stop]]. Ich vermute, es ist wieder verwendbare Module von Drittanbietern solche Aufgaben noch weiter zu erleichtern, aber ich kann Dich nicht auf einen Punkt ...

Forth kann auch auf diese ziemlich gut, aber es ist ein bisschen obskur.

Nun, wenn die Geschwindigkeit nicht eine Überlegung ist, und Sie wollen, Perl, übersetzen, dann jede Zeile binär in eine Reihe von Zeichen - 0 und 1 ist. Ja, ich weiß, dass es keine Zeilenumbrüche in binär sind :) aber vermutlich haben Sie einige feste Größe - z.B. von Byte oder einem anderen Gerät, mit dem Sie den binären Blob brechen können.

Dann benutzen Sie einfach die Perl-String-Verarbeitung dieser Daten:)

Wenn Sie Binärebene Verarbeitung tun, ist es sehr niedriges Niveau und muss wahrscheinlich sehr effizient und minimale Abhängigkeiten sein / installieren Anforderungen.

So würde ich mit C gehen - Griffe Bytes gut -. Und Sie können für einige Bibliothekspakete wahrscheinlich googeln, die Bytes verarbeiten

Möchten Sie so etwas wie Erlang führt Ineffizienzen, Abhängigkeiten und andere Gepäck Sie wahrscheinlich mit einem Low-Level-Bibliothek nicht wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top