17

私の問題は、JAVA で実装されている汎用パーサーを使用して、さまざまな種類のバイナリ ファイルを解析したいということです。おそらく、パーサーによって読み取られる構成ファイルを使用してファイル形式を記述したり、ある種の解析規則に従ってファイルを解析する Java クラスを作成したりします。

インターネットでかなり検索しましたが、このトピックについてはほとんど何も見つかりませんでした。

私が見つけたのは、コンパイラ ジェネレータ (Jay、Cojen など) を扱うものだけですが、それらを使用してバイナリ ファイルを解析するためのものを生成できるとは思いません。しかし、私はその仮定で間違っている可能性があります。

特にバイナリファイルの簡単な解析を扱うフレームワークはありますか、それともパーサー/コンパイラジェネレーターを使用してそうする方法を誰かに教えてもらえますか?

更新:次のような構成ファイルを記述できるものを探しています

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

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

そして、「MAGIC」で始まり、10 倍の content-package が続くファイルを解析するものを自動的に生成します (それ自体は、1 バイト、長い文字列、および 10 バイトの文字列で構成されます)。

Update2 : 探しているものに匹敵するもの、「コンストラクト」を見つけましたが、残念ながらこれは Python フレームワークです。たぶん、これは誰かが私が探しているアイデアを得るのに役立ちます.

4

8 に答える 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);

問題が発生した場合はお知らせください。

于 2009-07-10T19:05:06.617 に答える
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+構成+ファイル

于 2009-03-13T21:52:59.823 に答える
3

Googleのプロトコルバッファ

于 2009-03-15T20:02:50.407 に答える
1

パーサー・コンビネーター・ライブラリーはオプションです。JParsecは正常に動作しますが、遅くなる可能性があります。

于 2009-03-14T21:51:40.233 に答える
1

疑似言語でバイナリファイルの構造を説明する必要がある場合に備えて、バイナリデータhttps://github.com/raydac/java-binary-block-parserを解析できるJava用のフレームワークを開発しています

于 2014-07-11T09:59:15.907 に答える
-2

JavaCCなどのパーサーを使用してバイナリ ファイルを解析できます。ここに簡単な例があります。おそらく、テキスト ファイルの解析よりも少し難しいでしょう。

于 2009-03-14T09:19:23.137 に答える
-3

パーサーの世界を調べていますか。優れたパーサーはyaccで、Java 用のポートがあるかもしれません。

于 2009-03-14T03:14:20.940 に答える