16


11

私の問題は、私はJAVAで実装されている一般的なパーサを使って異なるタイプのバイナリファイルを解析したいということです。 パーサーによって読み取られる構成ファイル、またはある種の構文解析規則に従ってファイルを解析するJavaクラスの作成を使用して、ファイル形式を記述することもできます。

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

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

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

更新:私は次のような設定ファイルを書くことができるものを探しています

ファイル:ヘッダー:FIXED( "MAGIC")ボディ:コンテンツ(10)

内容:値1:バイト値2:長期値3:文字列(10)

そして、それは "MAGIC"で始まり、その後に10倍の内容パッケージ(それ自体がバイト、長さ、および10バイトの文字列からなる)で始まるファイルを解析するものを自動的に生成します。

  • Update2 *:私が探しているものと同等のもの、 " Construct"を見つけましたが、残念ながらこれはPythonフレームワークです。 たぶんこれは誰かがアイデアを得るのを助けます、私が探しているもの。

8 Answer


12


https://github.com/wspringer/preon[Preon]を使用する:
公開クラスFile {

@BoundString(match = "MAGIC")プライベート文字列ヘッダ。

@BoundList(size = "10"、type = Body.class)プライベートリストの本体。

プライベート静的クラスBody {

@バウンドバイト値1。

@Bound long value2;

@BoundString(size = "10")文字列値3。

}

}

データのデコード:

コーデックcodec = Codecs.create(File.class);ファイルfile = codecs.decode(codec、buffer);

あなたが問題にぶつかっているかどうか私に知らせてください。


10


バイナリファイルの読み取りにDataInputStreamを使用し、その規則をJavaで作成しました。 ;)バイナリファイルはほぼあらゆるフォーマットを持つことができるので、それらを読む方法についての一般的な規則はありません。

フレームワークはいつも物事を単純にするわけではありません。 あなたの場合、記述ファイルはDataInputStreamを使ってデータを読むためのコードより長いです。

public static void parse(DataInput in)はIOExceptionをスローします。{
//        file:
//          header: FIXED("MAGIC")
文字列header = readAsString(in、5); assert.e.eals( "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)
文字列値3 = readAsString(in、10); }}

public static String readAsString(DataInput in、int len)IOExceptionをスローします。{byte [] bytes = new byte [len]; in.readFully(bytes);新しい文字列(バイト)を返します。 }

設定ファイルが欲しいなら、Java設定ファイルを使うことができます。 http://www.google.co.uk/search?q=java設定ファイル


10


http://preon.sourceforge.net/[preon]を試してみる


1


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


1


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


-2


あなたは JavaCCのようなパーサでバイナリファイルを解析することができます。 こちら簡単な例を見つけることができます。 おそらく、テキストファイルを解析するよりも少し難しいです。


-3


パーサーの世界を覗いていますか。 良いパーサーは yaccです、そしてそれはjava用の移植版があるかもしれません。