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

时间:2009-03-13 21:45:44

标签: java parsing file-io binary-data

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

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

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

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

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

file:
  header: FIXED("MAGIC")
  body: content(10)

content:
  value1: BYTE
  value2: LONG
  value3: STRING(10)

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

UPDATE2 : 我发现了一些与我正在寻找的东西相当的东西,“Construct”,但遗憾的是这是一个Python框架。也许这有助于某人获得一个想法,我正在寻找什么。

8 个答案:

答案 0 :(得分:12)

使用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;

  }


}

解码数据:

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

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

答案 1 :(得分:11)

尝试preon

答案 2 :(得分:10)

我已经使用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

答案 3 :(得分:3)

Google的Protocol Buffers

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:-2)

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

答案 7 :(得分:-3)

您是否正在研究解析器的世界。一个好的解析器是yacc,并且它可能有一个java的端口。