Существуют ли какие-либо Java Framework для анализа двоичных файлов?

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

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

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

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

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

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

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

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

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


person Kosi2801    schedule 13.03.2009    source источник


Ответы (8)


попробуйте preon

person dfa    schedule 12.06.2009
comment
К сожалению, лицензия GPL. Обновление: это GPL версии 2. Дополнительную информацию см. Здесь: stackoverflow.com/questions/6698740/ - person shader; 30.05.2012
comment
@shader - Как указывает комментарий к этому Вопросу, вы можете получить коммерческую лицензию, если GPL вам не подходит. - person Stephen C; 29.07.2014
comment
Preon теперь имеет лицензию MIT - person Emmanuel Bourg; 30.05.2019

Используя 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);

Сообщите мне, если у вас возникнут проблемы.

person Wilfred Springer    schedule 10.07.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

person Peter Lawrey    schedule 13.03.2009
comment
Я знаю, что двоичные файлы могут иметь любой формат, но PNG-файл всегда имеет одну и ту же структуру, BMP всегда имеет такую ​​же структуру ... Я хочу: создать описание, например, для файла. BMP, загрузите его во фреймворк, загрузите BMP, а затем получите легкий доступ к каждому отдельному элементу проанализированного контента. - person Kosi2801; 14.03.2009
comment
Kosi2801: Если вы можете написать спецификацию или просто серию шагов для такого фреймворка, как это действительно работает, то это выполнимо. Если не можешь, значит, нет. - person Esko; 14.03.2009
comment
@Perter Lawrey: В этом простом случае вы правы, конфиг длиннее. Но моя цель - иметь возможность доставить что-то клиенту, где я могу позже предоставить дополнительные конфигурации для поддержки дополнительных форматов файлов. Подумайте о разборе файлов изображений, когда вы не можете обновить двоичный файл для клиента ... - person Kosi2801; 15.03.2009
comment
@ Kosi2801 Я не уверен, почему вы считаете, что предоставить текстовый файл проще, чем предоставить файл класса или jar. Если вам нужно предоставить обновление в виде текста, вы можете использовать BeanShell, apache-jci или встроенный API компилятора для компиляции / загрузки кода Java на лету. - person Peter Lawrey; 15.03.2009
comment
Хороший пример, но я бы настоятельно не рекомендовал вызывать этот String-конструктор! Всегда определяйте набор символов, иначе он вернется, чтобы укусить вас за спину ... - person Joachim Sauer; 15.03.2009
comment
С вашим обновлением вы разработали решение, в котором структура файла для чтения жестко запрограммирована в исходном коде. Мне нужно, чтобы конфигурационный файл описывал структуру файла, и парсер читал его в легкодоступном виде. Изменения происходят только в конфигурационном файле ... - person Kosi2801; 17.03.2009
comment
Вы можете развернуть файл Java как файл конфигурации. Нет никакой разницы, кроме используемого вами формата. В чем разница между текстовым файлом конфигурации и текстовым файлом java. Один из них не более жестко запрограммирован, чем другой. - person Peter Lawrey; 18.03.2009
comment
Пытался вести бизнес как можно дольше, но: с помощью программного обеспечения клиент должен иметь возможность предоставить описание формата файла в приложение без необходимости изучать Java и иметь дело со всеми нашими (чтобы быть готово) интерфейсы. Просто позвольте ему описать свой формат файла и готово ... - person Kosi2801; 18.03.2009
comment
Поэтому вместо изучения подмножества java (который они могут знать или для которого они могут получить помощь из Интернета) им приходится изучать новый язык, который вряд ли сможет описать все ситуации, которые им понадобятся, которые они определенно не будут знать, и не будет особого стимула тратить много времени. - person Peter Lawrey; 19.03.2009
comment
Точно. :) Если заказчик заказывает и не хочет на это его уговаривать, мы стараемся доставить. Я также думаю, что безопаснее и проще предоставить ему две страницы описания и ограниченный язык, вместо того, чтобы позволять ему возиться с ним внутри приложения и делать всевозможные вещи. - person Kosi2801; 19.03.2009
comment
Это уважительная причина. В этом случае я бы предложил что-то, что имеет простое соответствие тому, что вы бы делали на Java. Примечание. Возможно, вам придется поддерживать циклы и условную логику, что не так просто. Вы можете обнаружить, что вводите больше ошибок, чем решаете. - person Peter Lawrey; 19.03.2009
comment
Да, именно поэтому я изначально просил об уже существующей структуре. Но, похоже, в этом направлении нет ничего доступного, и я здесь сам по себе. Думаю, я буду придерживаться генераторов парсеров и создам серверную часть для чтения файлов для новых команд. Спасибо за разговор и идеи :) - person Kosi2801; 20.03.2009

протокольные буферы Google

person Community    schedule 15.03.2009
comment
Бегло взглянул на него, но, похоже, он не обеспечивает доступ на битовом уровне к содержимому потока данных, а каким-то образом инкапсулирует его (для обеспечения возможности и т. Д.). Мое предположение подтверждается также тем, что кажется необходимым использовать буферы протокола на обоих концах коммуникационного канала. - person Kosi2801; 17.03.2009

Библиотека комбинатора синтаксического анализатора - это опция. JParsec работает нормально, но может работать медленно.

person stepancheg    schedule 14.03.2009

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

person Igor Maznitsa    schedule 11.07.2014

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

person asalamon74    schedule 14.03.2009

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

person Milhous    schedule 14.03.2009