2010-03-11 9 views
13

Parsec ist so konzipiert, Textinformationen zu analysieren, aber es fällt mir ein, dass Parsec auch geeignet sein könnte Binärdateiformat Parsen für komplexe Formate, die beinhalten bedingte Segmente, Out-of-Order-Segmente etc.Verwenden von Haskells Parsec zum Analysieren von Binärdateien?

Gibt es zu tun eine Fähigkeit, dies oder ein ähnliches, alternatives Paket zu tun, das dies tut? Wenn nicht, was ist der beste Weg in Haskell, binäre Dateiformate zu analysieren?

Antwort

10

Sie könnten daran interessiert sein, AttoParsec, die für diesen Zweck entwickelt wurde, denke ich.

2

Es funktioniert gut, obwohl Sie Parsec 3, Attoparsec oder Iteratees verwenden möchten. Die Abhängigkeit von Parsec von String als Zwischendarstellung kann den Speicherbedarf erheblich aufblähen, während die anderen für die Verwendung von ByteStrings konfiguriert werden können.

Iteratees sind besonders attraktiv, da es einfacher ist, sicherzustellen, dass sie nicht am Anfang Ihrer Eingabe stehen bleiben und Datenblöcke inkrementell zugeführt werden können, wenn sie verfügbar sind. Dies verhindert, dass Sie im Voraus die gesamte Eingabe in den Speicher lesen müssen, und Sie können andere scheußliche Workarounds wie Lazy IO vermeiden.

+1

Das Parsec ist in Text.Parsec impliziert, es ist in erster Linie für Text, nicht binär, richtig? Selbst für ByteStrings macht es den Typ nur zu einer Instanz von Stream und Char. Was meinst du, es funktioniert gut? – me2

1

Der beste Ansatz hängt vom Format der Binärdatei ab.

Viele Binärformate wurden entwickelt, um das Parsen zu vereinfachen (im Gegensatz zu Textformaten, die hauptsächlich von Menschen gelesen werden sollen). Jedem Vereinigungsdatentyp wird also ein Diskriminator vorangestellt, der Ihnen sagt, welcher Typ erwartet werden soll, alle Felder haben entweder eine feste Länge oder ein Längenfeld, und so weiter. Für diese Art von Daten würde ich Data.Binary empfehlen; In der Regel erstellen Sie für jeden Typ in der Datei einen passenden Haskell-Datentyp und machen dann jeden dieser Typen zu einer Instanz von Binary. Definieren Sie die "get" -Methode zum Lesen; Es gibt eine "Get" -Monad-Aktion zurück, die im Grunde genommen ein sehr einfacher Parser ist. Sie müssen auch eine "Put" -Methode definieren.

Auf der anderen Seite, wenn Ihre Binärdaten nicht in diese Art von Welt passen, dann brauchen Sie attoparsec. Ich habe das nie benutzt, also kann ich nicht weiter kommentieren, aber this blog post ist sehr positiv.

12

Die wichtigsten Werkzeuge für binäre Dateien Parsen sind:

Binary die allgemeinste Lösung ist, Getreide für begrenzte Datengrößen groß sein kann, und attoparsec ist vollkommen in Ordnung für zB Parsing von Paketen. Alle diese sind im Gegensatz zu Parsec auf eine sehr hohe Leistung ausgerichtet. Es gibt viele Beispiele für Hacker.

+0

Ich denke, attoparsec ist der Weg zu gehen, aber ich habe Schwierigkeiten, Beispiele für die Analyse der tatsächlichen binären Daten zu finden. Das einzige Beispiel ist die RFC2616.hs, die im Repository enthalten ist, aber immer noch Text analysiert, nicht binär. Irgendwelche Vorschläge? – me2

+0

attoparsec wird erst kürzlich zum Parsen von Binärdaten vorgeschlagen. Bei der Arbeit gehen wir mit Data.Binary und Müsli. Es gibt viel mehr Beispiele, und dafür ist es bestimmt. attoparsec ist möglicherweise allgemeiner als Sie benötigen. –

Verwandte Themen