有没有适用于二进制文件解析的Java框架?

17
我的问题是,我想使用一个通用的JAVA解析器来解析不同类型的二进制文件。也许可以通过配置文件描述文件格式,然后由解析器读取配置文件,或者创建Java类来根据某种解析规则解析文件。
我在互联网上搜索了很多,但几乎没有关于这个主题的信息。
我找到的只是处理编译器生成器(Jay、Cojen等)的东西,但我不认为我可以使用它们来生成用于解析二进制文件的内容。但是这个假设可能是错误的。
是否有任何专门处理易于解析二进制文件的框架,或者有人能给我一些提示,我如何使用解析器/编译器生成器来实现?
更新:我正在寻找一种可以编写类似于配置文件的解决方案
file:
  header: FIXED("MAGIC")
  body: content(10)

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

它会自动生成一个解析以"MAGIC"开头的文件的程序,该文件紧随其后的是10个content-package(其中每个包含一个字节、一个长整型和一个10字节的字符串)。

更新2:我找到了一个类似于我所寻找的东西,叫做"Construct",但不幸的是它是一个Python框架。也许这可以帮助有人了解我所寻找的内容。

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

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


11

很遗憾,该许可证是GPL。更新:它是GPL版本2。更多信息请参见此处:https://dev59.com/Y1nUa4cB1Zd3GeqPYkDY - shader
@shader - 正如该问题的评论所指出的那样,如果GPL对您不起作用,您可以获得商业许可证。 - Stephen C
Preon现在已经获得了MIT许可。 - Emmanuel Bourg

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


2
我知道二进制文件可以有任何格式,但PNG文件始终具有相同的结构,BMP也始终具有相同的结构... 我的目标是:为例如BMP文件创建一个“描述”,将其提供给框架,提供一个BMP文件,然后轻松访问解析内容的每个单独元素。 - Kosi2801
@Kosi2801 我不确定为什么您认为提供一个文本文件比提供一个类或JAR文件更容易。如果您需要将更新作为文本提供,您可以使用BeanShell、apache-jci或内置的Compiler API来即时编译/加载Java代码。 - Peter Lawrey
1
不错的例子,但我强烈反对称之为字符串构造器!一定要定义字符集,否则它会让你后悔不已 ... - Joachim Sauer
因此,他们不必学习 Java 的子集(他们可能已经知道或可以从网络上获得帮助),而是必须学习一种新语言,这种语言不太可能描述他们需要的所有情况,他们肯定不会知道,并且没有太多动力去投入时间。 - Peter Lawrey
这个原因是合理的。在这种情况下,我建议采用一种与Java中所需操作有简单映射的东西。注意:您可能需要支持循环和条件逻辑,这并不简单。您可能会发现,您引入的错误比您解决的错误还要多。 - Peter Lawrey
显示剩余7条评论

3

1
我简单地看了一下,但似乎它不提供对数据流内容的位级访问,而是以某种方式封装它(以提供可选性等)。我的假设也得到了支持,因为在通信通道的两端都需要使用协议缓冲区。 - Kosi2801

1

1

解析器组合库是一个选项。JParsec 可以很好地工作,但它可能会比较慢。


-2

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


-3

你有没有了解过解析器的世界。一个好的解析器是yacc,而且可能有一个适用于Java的版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接