Image

Imageraydac wrote in Imageru_java

Category:

парсинг бинарных данных в Java

Разработал “еще один Java фреймворк” для парсинга и формирования бинарных блоков (я слишком ленив что бы писать тонны кода в Java для таких выкрутасов и был под впечатлением от Python Struct), я хотел что то маленькое, совместимое как с JavaSE так и с Android посему знакомьтесь - JBBP (Java Binary Block Parser).

Не буду слишком многословным и просто покажу как с данным фреймворком паковать и парсить бинарные блоки.

Давайте представим, что нам надо распарсить некий бинарный формат имеющий флаги как первый байт, затем беззнаковое 16 битное поле с размером данные и собственно сами данные в виде байтов и количеством заданным вторым полем. Код для парсинга с применением JBBP будет выглядеть так


JBBPParser.prepare(“byte flag; ushort length; byte [length] data;”);


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

@Bin class Parsed { byte flag; byte [] data; }
Parsed parsed = JBBPParser.prepare(“byte flag; ushort length; byte [length] data;”).parse(inputStream).mapTo(Parsed.class);

Теперь к данным легко достучаться через поля класса. Ок, я показал как распарсить блок,  давайте теперь покажу как запаковать такой же блок из распарсенных данных при помоще псевдо-DSL языка встроенного в JBBP


JBBPOut.
    BeginBin().

      Byte(parsed.flag).
      Short(parsed.data.length).
      Byte(parsed.data).
   End().toByteArray();

И всё! на мой взгляд весьма просто

Данный фреймворк совместим с Java 1.5+ и Android,  страничка проекта https://code.google.com/p/java-binary-block-parser/ а так же этот фремворк может быть использован как dependency в maven проектах, так как опубликован в централе

Так же Вы можете взглянуть на более сложные тестовые случаи, к примеру случай парсинга формата Java класс файлов с применением JBBP https://code.google.com/p/java-binary-block-parser/source/browse/src/test/java/com/igormaznitsa/jbbp/it/ClassParsingTest.java