バイナリファイル解析用のJavaフレームワークはありますか?
-
22-07-2019 - |
質問
私の問題は、JAVAで実装されている汎用パーサーを使用して、さまざまなタイプのバイナリファイルを解析することです。おそらく、パーサーによって読み取られる構成ファイルを使用してファイル形式を記述するか、何らかの解析規則に従ってファイルを解析するJavaクラスを作成します。
インターネットでかなり検索しましたが、このトピックにはほとんど何も見つかりませんでした。
私が見つけたのは、コンパイラ生成プログラム(Jay、Cojenなど)を扱うものだけですが、それらを使用してバイナリファイルを解析するための何かを生成できるとは思いません。しかし、私はその仮定に間違いがあるかもしれません。
特にバイナリファイルの簡単な解析を処理するフレームワークはありますか、またはパーサー/コンパイラジェネレーターを使用してこれを行う方法についてのヒントを教えてもらえますか?
更新: 私は次のような設定ファイルを書くことができるものを探しています
file:
header: FIXED("MAGIC")
body: content(10)
content:
value1: BYTE
value2: LONG
value3: STRING(10)
そして、" MAGIC"で始まるファイルを解析するものを自動的に生成し、その後に10回コンテンツパッケージ(それ自体はバイト、長い、および10バイトの文字列で構成されます)
Update2 : 私が探しているものに匹敵するものを見つけました、" Construct "ですが、残念ながらこれはPythonです-フレームワーク。たぶん、これは誰かが私が探しているアイデアを得るのに役立ちます。
解決
他のヒント
プリオンの使用:
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);
問題が発生しているかどうかを教えてください。
バイナリファイルの読み取りにDataInputStreamを使用し、Javaでルールを作成しました。 ;)バイナリファイルはほぼすべての形式を持つことができるため、それらの読み取り方法に関する一般的な規則はありません。
Frameworksは常に物事を単純化するとは限りません。あなたの場合、記述ファイルは、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
Googleのプロトコルバッファ
Parserコンビネータライブラリはオプションです。 JParsec は正常に動作しますが、時間がかかる可能性があります。
バイナリデータを解析できるJavaのフレームワークを開発しています https:// github.com/raydac/java-binary-block-parser バイナリファイルの構造を擬似言語で記述する必要がある場合
パーサーの世界をご覧ください。優れたパーサーは yacc であり、Java用の移植版があるかもしれません。