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

k4emjkb1  于 2023-01-01  发布在  Java
关注(0)|答案(8)|浏览(134)

我的问题是,我想用一个JAVA实现的通用解析器来解析不同类型的二进制文件,也许用一个解析器读取的配置文件来描述文件格式,或者创建Java类来根据某种解析规则解析文件。
我已经在网上搜索了相当多,但几乎没有找到这个主题。
我所发现的只是一些处理编译器-生成器的东西(Jay,Cojen,等等),但我不认为我可以用它们来生成解析二进制文件的东西,但我可能是错误的假设。
有没有专门处理二进制文件解析的框架,或者谁能给我一个提示,告诉我如何使用解析器/编译器生成器来做这件事?

    • 更新**:我正在寻找可以编写如下配置文件的工具
file:
  header: FIXED("MAGIC")
  body: content(10)

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

并且它自动地生成解析以"MAGIC"开头的文件的东西,后面跟随十倍的内容包(其本身由一个字节、一个长和一个10字节的串组成)。

    • 更新2**:我发现了一些类似的东西,我正在寻找,"Construct",但可悲的是,这是一个Python框架。也许这有助于有人得到一个想法,我正在寻找什么。
mccptt67

mccptt671#

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

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

5f0d552i

5f0d552i3#

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

ar5n3qh5

ar5n3qh55#

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

c90pui9n

c90pui9n6#

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

vaj7vani

vaj7vani7#

你可以用像JavaCC这样的解析器来解析二进制文件。Here你可以找到一个简单的例子,可能比解析文本文件要难一些。

a14dhokn

a14dhokn8#

你有没有看过解析器的世界,一个好的解析器是yacc,可能有一个java的移植。

相关问题