Сериализация проводного протокола - PullRequest
0 голосов
/ 12 июня 2018

Я ищу то, что я буду называть «генератором кода двоичного сериализатора / десериализатора» из-за отсутствия лучшего термина, который конкретно позволяет вам указать формат 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, которая отвечает моим критериям, кроме использования еще одного формата сериализации , или кто-то может привести пример, используя одну из этих ссылок для приведенной выше структуры?

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете рассмотреть ASN.1 для этого и использовать PER (выровненный или невыровненный).Вы можете использовать либо типы BIT STRING, ограниченные необходимой вам длиной, либо типы INTEGER с ограничениями, чтобы ограничить значения желаемым количеством битов.Поскольку ASN.1 и его правила кодирования не зависят от архитектуры машины и языка программирования, вам не нужно беспокоиться о том, является ли ваша машина с прямым порядком байтов или прямым порядком байтов, или предпочитает ли один конец коммуникаций Java, а не C илиC ++.Хороший инструмент ASN.1 обрабатывает все это для вас.Вы можете узнать больше об ASN.1 на странице проекта ASN.1 , на которой есть ссылка Введение в ASN.1 , а также список Инструментов ASN.1 (некоторые бесплатные, некоторые коммерческие).Причина, по которой я упоминаю UNALIGNED PER, заключается в том, что вы можете буквально передавать ровно столько бит в этой строке, сколько пожелаете, без добавления дополнительных битов между ними.

Для BIT STRINGS вы можете даже назначать имена отдельным битам, которые имеюткакое-то значение для вашего приложения.

...