парсинг бинарных данных в 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.c
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
