17

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

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

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

是否有任何框架可以特别处理二进制文件的简单解析,或者任何人都可以给我一个提示,我可以如何使用解析器/编译器生成器来做到这一点?

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

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

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

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

Update2:我找到了类似的东西,我正在寻找“构造”,但遗憾的是这是一个 Python 框架。也许这可以帮助某人了解我正在寻找的东西。

4

8 回答 8

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

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

于 2009-07-10T19:05:06.617 回答
11

试一试_

于 2009-06-12T09:01:39.247 回答
9

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

于 2009-03-13T21:52:59.823 回答
3

Google 的协议缓冲区

于 2009-03-15T20:02:50.407 回答
1

解析器组合库是一个选项。JParsec工作正常,但它可能很慢。

于 2009-03-14T21:51:40.233 回答
1

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

于 2014-07-11T09:59:15.907 回答
-2

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

于 2009-03-14T09:19:23.137 回答
-3

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

于 2009-03-14T03:14:20.940 回答