Что такое быстрый способ декодирования протокола данных, такого как FAST, в котором данные кодируются в байтах с битами в качестве флагов существования?
Такой протокол, как FAST, для кодирования данных очень умен для минимизации объема данных, которые необходимо отправить. По сути, каждый получает символ *, читая первые пару байтов как целое число, давая вам номер идентификатора, который указывает вам на инструкции о том, как декодировать остальное (то есть, он говорит вам, что остальные байты, например, являются соответственно int, строка, целое число без знака, другое целое число без знака, вложенное сообщение и т. д.) и следующие пару байтов сообщают вам (в каждом бите), присутствуют ли последующие поля или нет. 8-й бит в каждом байте зарезервирован для обозначения границ между данными.
Декодирование такого протокола кажется невозможным без линейного обхода битовых операций (и, или, и, сдвигов, битовых проверок)... есть ли способ сделать это быстрее?
2 ответа
Я думаю, вы не найдете технику или подход быстрее, чем описано. Такие протоколы предназначены для их последовательного анализа. Единственная причина для продолжения поиска - найти более удобный способ работы с данными.
Насколько я вижу, есть три пути:
- Просто сделайте это, как вы описали ниже
- Используйте низкоуровневый фреймворк, такой как Boost::Spirit, который имеет двоичные парсеры.
- Попробуйте использовать готовую библиотеку: например, QuickFAST - реализация протокола FAST для собственных C++ и.NET.
Декодирование такого протокола кажется невозможным без линейного обхода битовых операций (и, или, и, сдвигов, битовых проверок)... есть ли способ сделать это быстрее?
Протокол FAST кодирует значения с использованием подхода стоп-бита, другими словами, он последовательно анализирует байт, пока не достигнет байта с 8-м битом, установленным в 1. При этом вы теряете бит в каждом байте, но в целом это быстрый способ кодирования множества различных полей без необходимости разделительного байта между ними.
Посмотрите на эту статью о поддержке FAST от CoralFIX. Он содержит пример кода Java для FAST-декодера, сгенерированного из файла шаблона обмена XML.
Отказ от ответственности: я один из разработчиков CoralFIX.