代码之家  ›  专栏  ›  技术社区  ›  Kosi2801

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

  •  16
  • Kosi2801  · 技术社区  · 17 年前

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

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

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

    使现代化 : 我在找一个可以写配置文件的地方,比如

    file:
      header: FIXED("MAGIC")
      body: content(10)
    
    content:
      value1: BYTE
      value2: LONG
      value3: STRING(10)
    

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

    : Construct “,但遗憾的是,这是一个Python框架。也许这有助于人们了解我在寻找什么。

    8 回复  |  直到 10 年前
        1
  •  12
  •   bbaja42    14 年前

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

        2
  •  11
  •   dfa    17 年前

    试一试 preon

        3
  •  9
  •   Peter Lawrey    17 年前

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

        4
  •  3
  •   user75832 user75832    17 年前
        5
  •  1
  •   stepancheg    17 年前

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

        6
  •  1
  •   Igor Maznitsa    11 年前

    https://github.com/raydac/java-binary-block-parser 在这种情况下,您应该用伪语言描述二进制文件的结构

        7
  •  -2
  •   asalamon74    17 年前

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

        8
  •  -3
  •   Milhous    17 年前

    你有没有研究过解析器的世界。一个好的解析器是 yacc ,它可能有一个用于java的端口。