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

有没有用于二进制文件解析的Java框架?,java,parsing,file-io,binary-data,Java,Parsing,File Io,Binary Data,我的问题是,我想用JAVA实现的通用解析器解析不同类型的二进制文件。可能使用解析器读取的配置文件描述文件格式,或者创建Java类,根据某种解析规则解析文件 我在网上搜索了很多,但几乎没有找到关于这个话题的任何东西 我所发现的只是处理编译器生成器(Jay、Cojen等)的东西,但我不认为我可以使用它们来生成解析二进制文件的东西。但我可能在这个假设上错了 有没有专门处理二进制文件轻松解析的框架,或者有人能告诉我如何使用解析器/编译器生成器来实现这一点 更新: 我在找一个可以写配置文件的地方,比如 f

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

我在网上搜索了很多,但几乎没有找到关于这个话题的任何东西

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

有没有专门处理二进制文件轻松解析的框架,或者有人能告诉我如何使用解析器/编译器生成器来实现这一点

更新: 我在找一个可以写配置文件的地方,比如

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

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

更新2
我发现了一些类似于我正在寻找的东西,“,但遗憾的是,这是一个Python框架。也许这有助于人们了解我在寻找什么。

我使用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);
}
publicstaticvoidparse(DataInput-in)抛出IOException{
//文件:
//标题:固定(“魔术”)
字符串头=readAsString(in,5);
断言header.equals(“MAGIC”);
//正文:内容(10)
//??不确定这意味着什么
//内容:

对于(int i=0;i您了解了解析器的世界。一个好的解析器是,java可能有它的一个端口。

您可以使用类似的解析器解析二进制文件。您可以找到一个简单的示例。它可能比解析文本文件更难。

解析器组合器库是一个选项。工作正常,但速度可能较慢。

> 谷歌的

尝试使用:

公共类文件{
@BoundString(match=“MAGIC”)
私有字符串头;
@边界列表(size=“10”,type=Body.class)
私人名单机构;
私有静态类主体{
@束缚
字节值1;
@束缚
长期价值2;
@边界字符串(size=“10”)
字符串值3;
}
}
解码数据:

Codec<File> codec = Codecs.create(File.class);
File file = codecs.decode(codec, buffer);
Codec-Codec=Codecs.create(File.class);
File File=codecs.decode(编解码器,缓冲区);

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

我一直在为Java开发一个框架,允许解析二进制数据
在这种情况下,您应该用伪语言描述二进制文件的结构

我知道二进制文件可以有任何格式,但PNG文件总是具有相同的结构,BMP文件总是具有相同的结构…我想要的是:创建一个“描述”对于一个例如.BMP文件,将其输入框架,输入一个BMP,然后可以轻松访问解析内容的每个元素。Kosi2801:如果您可以编写规范或只是一系列“它的实际工作原理”这样的框架的步骤,那么它是可行的。如果你不能,它不是。@Perter Lawrey:在这种简单的情况下,你是对的,配置更长。但我的目标是能够向客户端提供一些东西,我可以在以后提供额外的配置以支持额外的文件格式。考虑在无法更新二进制文件的情况下解析图像文件客户…@Kosi2801我不知道为什么您觉得提供文本文件比提供类或jar文件容易。如果您需要以文本形式提供更新,您可以使用BeanShell、apache jci或内置编译器API动态编译/加载java代码。这是一个很好的示例,但我强烈反对调用该字符串构造函数!始终是d定义一个字符集,否则它会回来咬你的背后…看了一眼,但它似乎不提供对数据流内容的位级访问,而是以某种方式封装它(以提供可选性等)。我的假设也得到了支持,因为似乎有必要在通信通道的两端使用协议缓冲区。不幸的是,许可证是GPL。更新:它是GPL版本2。有关更多信息,请参阅此处:@shader-正如对该问题的评论所示,如果GPL不适用于您,您可以获得商业许可证。Preon现在已获得MIT许可证
Codec<File> codec = Codecs.create(File.class);
File file = codecs.decode(codec, buffer);