Существуют ли какие-либо Java Frameworks для анализа двоичных файлов? - PullRequest
16 голосов
/ 14 марта 2009

Моя проблема в том, что я хочу анализировать двоичные файлы разных типов с помощью универсального синтаксического анализатора, который реализован в JAVA. Может быть, описание формата файла с помощью файла конфигурации, который читается синтаксическим анализатором, или создание классов Java, которые анализируют файлы в соответствии с какими-то правилами синтаксического анализа.

Я немного искал в интернете, но почти ничего не нашел по этой теме.

То, что я обнаружил, это просто вещи, которые имеют дело с генераторами компиляторов (Jay, Cojen и т. Д.), Но я не думаю, что смогу использовать их для генерации чего-то для разбора двоичных файлов. Но я могу ошибаться в этом предположении.

Существуют ли какие-либо фреймворки, которые имеют дело, в частности, с простым синтаксическим анализом двоичных файлов, или кто-нибудь может дать мне подсказку, как я мог бы использовать для этого парсер / компилятор-генераторы?

Обновление : Я ищу что-то, где я могу написать конфигурационный файл, такой как

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

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

и автоматически генерирует что-то, что анализирует файлы, начинающиеся с «MAGIC», за которым следует пакет содержимого в десять раз (который сам состоит из байта, длинной и 10-байтовой строки).

Update2 : Я нашел нечто сопоставимое с тем, что я ищу, « Construct », но, к сожалению, это Python-Framework. Может быть, это поможет кому-то понять, что я ищу.

Ответы [ 8 ]

12 голосов
/ 10 июля 2009

Использование Преон :

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

Дайте мне знать, если у вас возникнут проблемы.

11 голосов
/ 12 июня 2009

попробуй preon

10 голосов
/ 14 марта 2009

Я использовал 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

3 голосов
/ 15 марта 2009
1 голос
/ 11 июля 2014

Я занимаюсь разработкой инфраструктуры для Java, которая позволяет анализировать двоичные данные https://github.com/raydac/java-binary-block-parser в случае, если вы просто опишите структуру вашего двоичного файла в псевдоязыке

1 голос
/ 15 марта 2009

Библиотека комбинатора Parser является опцией. JParsec работает нормально, но может быть медленным.

0 голосов
/ 14 марта 2009

Вы можете анализировать двоичные файлы с помощью синтаксических анализаторов, таких как JavaCC . Здесь вы можете найти простой пример. Возможно, это немного сложнее, чем анализ текстовых файлов.

0 голосов
/ 14 марта 2009

Вы заглядываете в мир парсеров. Хороший синтаксический анализатор - yacc , и может быть порт этого для java.

...