2009-06-12 10 views
4

Ich untersuche Möglichkeiten zur formellen Spezifikation des Formats für verschiedene binäre Datenströme und verwende ein Tool, um Datenströme auf Einhaltung der Spezifikation zu überprüfen. Etwas wie XSD + eines der Validierungstools für XML. Oder wie extrem komplizieren grep Ausdruck arbeiten auf einer binären Ebene (vorzugsweise nicht - das wäre wirklich schwer zu lesen).Strukturvalidierung für Binärdateien

Kennt jemand eine Spezifikation/Werkzeug, das nützlich wäre?

[Begründung: Wir erhalten viele von Drittanbietern generierte Binärdateien auf einer täglichen Basis und oft verwenden sie schlechte Werkzeuge, die ungültige Dateien erzeugen. Wir wollen, dass sie ein Werkzeug geben, die sie als Prüfung nutzen könnten, und wir wollen kein spezielles Werkzeug für jedes Format schreiben]

+0

Diese Probleme sind natürlich genau der Grund, warum XML erfunden wurde - gibt es keine Chance, darauf umzusteigen? –

+0

Nein. Wir müssen Legacy-Formate unterstützen :( – gabr

Antwort

3

Wenn Sie denken, Java Class-Dateien Dokumentation ein gutes Beispiel für eine Spezifikation ist, zu überdenken betrachten Preon. Preon ist capturing it entirely und generiert Dokumentation wie this.

Es gibt tatsächlich ein paar andere Initiativen zur Erfassung der 'Syntax' von binär kodierten Dateien. ASN.1 ist nützlich, aber es bringt Ihnen nicht viele Kilometer, wenn Sie beispielsweise Java-Klassendateien erfassen möchten. Das Gleiche gilt für BSDL, Flavor, BFlavor und einige andere Initiativen.Problem ist: Es gibt eine Million Möglichkeiten, binäre Daten zu verschlüsseln, viele binäre Komprimierungstechniken, und ich denke, das bedeutet, dass nie etwas sein wird, das es vollständig erfasst, es sei denn, die Sprache selbst ist erweiterbar.

Google-Protokoll-Puffer hat grundsätzlich das gleiche Problem. Es definiert so etwas wie Corbas CDR, und es ist gut, solange Sie nicht etwas fortgeschritteneres brauchen. Mit Google-Protokollpuffern können Sie das Klassendateiformat von Java nicht erfassen.

0

Abstrakte Syntax Notation One: ASN.1. Siehe auch die NCBI Toolbox: http://www.ncbi.nlm.nih.gov/Sitemap/Summary/asn1.html

+0

Interessant, aber vielleicht ein bisschen zu schwer für uns. Außerdem hasste ich immer die Spezifikationen, die nicht frei verfügbar sind. – gabr

+0

Die Spezifikation bei NCBI und die Tools sind frei abrufbar. Zum Beispiel http : //tinyurl.com/mlylt4 ist die Definition einer DNA-Sequenz und kann als binärer Code gelesen/geschrieben werden (http://www.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nucleotide&id) = 5 & retmode = asn.1), Text (http://www.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nucleotide&id=5&rettype=fasta&retmode=text), xml (http: // www .ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi? db = Nukleotid & id = 5 & retype = fasta & retmode = xml), ... – Pierre

1

Dies ist eine interessante Frage, aber ich wäre sehr überrascht, wenn eine solche Spezifikationssprache existiert. Dies liegt daran, dass die Metastruktur-Möglichkeiten von Binärdateien effektiv unendlich sind. Vergleichen Sie dies mit XML, wobei die Meta-Struktur (Tags enthalten andere Tags, nur ein Attribut kann einen Namen haben usw.) streng spezifiziert ist. Und selbst mit dieser Struktur ist es schwierig, XML-Schemas zu schreiben! Der einzige Weg, wie ich mit den unendlichen Möglichkeiten binärer Dateiformate umgehen kann, ist, etwas zu verwenden, das selbst unendliche Variabilität erlaubt - eine Turing-vollständige Programmiersprache.

Das ist natürlich nicht zu sagen, dass für Ihre spezielle Problemdomäne eine nützliche Spezifikationssprache und ein Prozessor dafür nicht produziert werden konnte. Ich denke nur, dass es dir schwer fallen wird, einen vorgefertigten zu finden. Ich hoffe, die Antworten hier beweisen, dass ich falsch liege!

+0

Ja, deine Gedanken stimmen genau mit mir überein, aber ich habe meinem Chef versprochen, das Problem zu untersuchen, so ... – gabr

3

geben einen Versuch zu Preon:

  • Annotations angetrieben
  • Teile conditionals
  • Ausdruckssprache

jeweils kommentierten Klasse ist eine Codec Beschreibung, die sowohl eine Encoder erzeugen kann, und a Decoder.

+0

Danke, aber da wir das Java nicht verwenden, scheint das wenig zu nützen.Wenn ich es richtig lese, müsste ich eac re-implementieren h Protokoll als eine Reihe von Java-Klassen und dann Preon zu generieren Decoder, die ich dann zum Testen verwenden konnte. Ich suche nach etwas formalerem und näher an der binären Ebene (d. H. Ich würde gerne von oben anfangen, nicht umgekehrt). Auf diese Weise konnte ich mit dem gleichen Tool unsere Stromgeneratoren testen. – gabr

+1

überprüfen Sie auch die Google-Protokollpuffer DSL: http://code.google.com/apis/protocolbuffers/docs/overview.html – dfa

+0

Dies könnte möglicherweise nützlich sein. Bitte füge es als separate Antwort hinzu, damit ich es abstimmen kann :) – gabr