我的问题是,我想要分析的二进制文件的不同类型与一个通用分析器,这是实现。也许描述的文件格式用配置文件,该文件是读通过分析器或创建Java类分析的文件,根据某种分析的规则。

我已经搜查了相当一位在互联网上,但发现,几乎没有关于这一主题。

我找到了什么都是事处编译器的发电机(杰,Cojen,等等。) 但我不认为我可以用它们来生成的东西,用于分析的二进制文件。但我可能是错误的,假设。

是否有任何框架,处理特别是易分析的二进制文件或任何人都可以给我一个暗示我怎么可能使用parser/compiler发电机要这样做吗?

更新:我在寻找东西在那里我可以写一config-file喜欢

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

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

和它的自动生成的东西,它分析文件,开始与"魔法",随后的十倍的内容包(其本身包含一个字节,长以及一个10-byte string)。

Update2:我发现了一些可比我在寻找什么,"建造"但可悲的是,这是一个巨蟒框架。也许这可以帮助别人得到一个主意,我在寻找什么.

有帮助吗?

解决方案

给一个尝试 preon

其他提示

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

让我知道如果你遇到的问题。

我已经使用进阅读的二进制文件和编写规则。;)的二进制文件只能有关的任何格式,因此没有任何一般性规则如何阅读。

框架并不总是让事情简单。在你的情况下,介绍文件长于代码以只读数据的使用进.

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

谷歌的 协议的缓冲区

分析器组合的图书馆是一个选项。 JParsec 工作正常,但是它可以是缓慢的。

我已经开发了一个框架Java其允许的二进制数据分析 https://github.com/raydac/java-binary-block-parser 在这种情况下,你应该只是描述结构你的二进制文件在pseudolanguage

你可以分析二进制文件用的分析程序喜欢 JavaCC. 在这里, 你可以找到一个简单的例子。它可能是一个比较难于分析文本文件。

你有没有看到世界的分析程序.一个很好的分析程序 yacc, ,并有可能成为一个港口的java。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top