Я ищу то, что я буду называть «генератором кода двоичного сериализатора / десериализатора» из-за отсутствия лучшего термина, который конкретно позволяет вам указать формат on-the-wire с произвольным битомдлины, а затем генерирует необходимый код C / C ++ для упаковки / распаковки пакетов в этом формате.Я начал с использования структуры с битовыми полями, но после прочтения этого поста мне интересно, есть ли уже что-то, что решает все беспорядочные проблемы.Пример структуры данных, с которой мне пришлось бы иметь дело:
struct header {
unsigned int val1 : 8;
unsigned int val2 : 24;
unsigned int val3 : 16
unsigned int val4 : 2;
unsigned int val5 : 3;
unsigned int val6 : 1;
unsigned int val7 : 10;
}
Мотивация для сохранения полей структуры данных такова, что это облегчает программистам работу по настройке / получению полей на основе того, чтоони совпадают в протоколе, напр.val5 может быть значимым 3-битным флагом.Да, я мог бы просто иметь два 32-битных значения для всей структуры и использовать битовые маски и прочее, чтобы отслеживать все, но почему?
Я знаю такие вещи, как Google Proto Buf и тому подобное, ноAFAIK - все они сосредоточены на структуре данных на стороне программиста и не позволяют вам задавать конкретные битовые шаблоны - представьте себе, что вы пытаетесь создать клиентский код для протоколов низкого уровня, где задан двоичный формат проводника.Самое близкое, что я нашел, это protlr , который звучит великолепно, за исключением того, что это не FOSS.Другие сообщения на SO указывают на:
- RedBlocks , который, кажется, является частью полноценного встроенного фреймворка.
- PADS , который кажетсячрезвычайно устаревший и слишком сложный для моих нужд.
- binpac , что звучит интересно, но я не могу найти пример использования его для анализа произвольной длины в битах (например, 1 бит, 2 бита, 17битовые поля) или если он также имеет метод сериализации, так как он, кажется, сосредоточен на односторонней десериализации для обнаружения вторжений.
Существует ли альтернатива FOSS, которая отвечает моим критериям, кроме использования еще одного формата сериализации , или кто-то может привести пример, используя одну из этих ссылок для приведенной выше структуры?