Gibt es Java-Frameworks für binäre Datei Parsing?
-
22-07-2019 - |
Frage
Mein Problem ist, dass ich ein Binär-Dateien unterschiedlicher Typen mit einem generischen Parser analysieren will, die in JAVA implementiert. Vielleicht mit einer Konfigurationsdatei das Dateiformat beschrieben werden, die durch die Parser oder das Erstellen von Java-Klassen, die die Dateien analysieren gelesen wird nach einer Art von Parsing-Regeln.
Ich habe ziemlich viel im Internet gesucht, aber gefunden fast nichts zu diesem Thema.
Was ich habe festgestellt, sind nur Dinge, die mit Compiler-Generatoren beschäftigen (Jay, CoJen, etc.), aber ich glaube nicht, dass ich sie etwas für das Parsen von Binär-Dateien zu erzeugen, verwenden kann. Aber ich konnte auf dieser Annahme falsch sein.
Gibt es Rahmenbedingungen, die vor allem befassen sich mit einfacher Analyse von binären Dateien oder kann mir jemand einen Tipp geben, wie ich Parser / Compiler-Generatoren verwenden könnte, dies zu tun?
Aktualisieren : Ich suche nach etwas, wo ich eine config-Datei wie
schreibenfile:
header: FIXED("MAGIC")
body: content(10)
content:
value1: BYTE
value2: LONG
value3: STRING(10)
und erzeugt automatisch etwas, das Dateien, die mit „MAGIC“, gefolgt von der zehnfachen Gehalt-Paket.
(die selbst eine lange und eine 10-Byte-String besteht aus einem Byte) beginnen parstUpdate2 : Ich fand etwas vergleichbar, was ich suche „ Construct “, aber leider ist dies ein Python-Framework- . Vielleicht hilft das jemand eine Idee zu bekommen, was ich suche.
Lösung
gibt einen Versuch PREON
Andere Tipps
Mit Preon :
public class File {
@BoundString(match="MAGIC")
private String header;
@BoundList(size="10", type=Body.class)
private List<Body> body;
private static class Body {
@Bound
byte value1;
@Bound
long value2;
@BoundString(size="10")
String value3;
}
}
Die Decodierung Daten:
Codec<File> codec = Codecs.create(File.class);
File file = codecs.decode(codec, buffer);
Lassen Sie mich wissen, wenn Sie Probleme ausgeführt werden.
Ich habe Datainputstream zum Lesen von Binär-Dateien verwendet, und ich schreibe die Regeln in Java. ;) Binär-Dateien können fast jedes Format haben, so gibt es keine allgemeine Regel dafür, wie ist sie zu lesen
.Frameworks nicht immer die Dinge einfacher. In Ihrem Fall ist die Beschreibungsdatei länger als der Code nur die Daten lesen Sie einen Datainputstream verwenden.
public static void parse(DataInput in) throws IOException {
// file:
// header: FIXED("MAGIC")
String header = readAsString(in, 5);
assert header.equals("MAGIC");
// body: content(10)
// ?? not sure what this means
// content:
for(int i=0;i<10;i++) {
// value1: BYTE
byte value1 = in.readByte();
// value2: LONG
long value2 = in.readLong();
// value3: STRING(10)
String value3 = readAsString(in, 10);
}
}
public static String readAsString(DataInput in, int len) throws IOException {
byte[] bytes = new byte[len];
in.readFully(bytes);
return new String(bytes);
}
Wenn Sie eine Konfigurationsdatei haben Sie eine Java-Konfigurationsdatei verwenden können. http://www.google.co.uk/search?q=java + Konfiguration + Datei
Google Protocol Buffers
Parser combinator Bibliothek ist eine Option. JParsec funktioniert gut, aber es könnte langsam sein.
Ich habe einen Rahmen für Java entwickelt, die Binärdaten https: // github.com/raydac/java-binary-block-parser in dem Fall sollten Sie nur Struktur Ihrer Binärdatei in pseudolanguage beschreiben
Haben Sie in die Welt von Parsern suchen. Ein guter Parser ist yacc , und es kann ein Port für Java sein.