是否存在用于二进制文件解析的Java框架?

我的问题是,我想用一个在JAVA中实现的通用解析器来解析不同类型的二进制文件。 也许用一个配置文件描述文件格式,该配置文件由解析器读取或创建根据某种解析规则解析文件的Java类。

我在互联网上搜索了很多,但在这个主题上几乎找不到任何东西。

我发现的只是涉及编译器生成器(Jay,Cojen等)的东西,但我认为我不能用它们来生成解析二进制文件的东西。 但我在这个假设上可能是错的。

是否有任何框架特别容易解析二进制文件或任何人可以给我一个提示如何使用解析器/编译器生成器这样做?

更新 :我正在寻找可以编写配置文件的东西

file: header: FIXED("MAGIC") body: content(10) content: value1: BYTE value2: LONG value3: STRING(10) 

它会自动生成一些东西来解析以“MAGIC”开头的文件,然后是内容包的十倍(它本身由一个字节,一个长字节和一个10字节的字符串组成)。

Update2 :我发现了一些类似于我正在寻找的东西,“ 构造 ”,但遗憾的是这是一个Python框架。 也许这有助于某人得到一个想法,我正在寻找什么。

试试preon

使用Preon :

 public class File { @BoundString(match="MAGIC") private String header; @BoundList(size="10", type=Body.class) private List body; private static class Body { @Bound byte value1; @Bound long value2; @BoundString(size="10") String value3; } } 

解码数据:

 Codec codec = Codecs.create(File.class); File file = codecs.decode(codec, buffer); 

如果您遇到问题,请告诉我。

我使用DataInputStream来读取二进制文件,然后用Java编写规则。 ;)二进制文件可以具有几乎任何格式,因此没有关于如何阅读它们的一般规则。

框架并不总是使事情变得简单。 在您的情况下,描述文件比仅使用DataInputStream读取数据的代码长。

 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); } 

如果要拥有配置文件,可以使用Java配置文件。 http://www.google.co.uk/search?q=java+configuration+file

谷歌的协议缓冲区

Parser combinator库是一个选项。 JParsec工作正常,但可能很慢。

我一直在开发一个Java框架,允许解析二进制数据https://github.com/raydac/java-binary-block-parser ,你应该用伪语言来描述二进制文件的结构

您可以使用JavaCC等解析器解析二进制文件。 在这里你可以找到一个简单的例子。 可能它比解析文本文件困难一些。

你有没有研究解析器的世界。 一个好的解析器是yacc ,它可能有一个java的端口。