Ответ 1
попробуйте preon
Моя проблема в том, что я хочу разбирать двоичные файлы разных типов с помощью общего парсера, который реализован в 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-Framework. Возможно, это помогает кому-то понять, что я ищу.
попробуйте 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);
Сообщите мне, если у вас проблемы.
Я использовал 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
Google Буферы протокола
Библиотека комбинаторных парсеров является опцией. JParsec работает отлично, однако это может быть медленным.
Я разрабатываю среду для Java, которая позволяет анализировать двоичные данные https://github.com/raydac/java-binary-block-parser в случае вам следует просто описать структуру вашего двоичного файла в псевдоязыке
Вы можете анализировать двоичные файлы с помощью парсеров типа JavaCC. Здесь вы можете найти простой пример. Вероятно, это немного сложнее, чем разбор текстовых файлов.
Вы смотрите в мир парсеров. Хороший парсер yacc, и для него может быть порт для java.