2012-06-09 1 views
1

Протокол, такой как FAST для кодирования данных, очень умный в минимизации объема данных, которые необходимо отправить. По существу, каждый получает char *, считывая первые пару байтов как целое число, дает вам номер идентификатора, который указывает вам на инструкции о том, как декодировать остальное (то есть он сообщает вам, что остальные байты, например, учитывают int, строка, unsigned int, другое unsigned int, вложенное сообщение и т. д.), а следующие пару байтов говорят вам (в каждом бите), есть ли следующие поля или нет. 8-й бит в каждом байте зарезервирован для обозначения границ между данными.Что такое быстрый способ декодирования протокола данных, например FAST, в котором данные закодированы в байтах с битами как флаги существования?

Декодирование такого протокола кажется невозможным без линейного обхода бит ops (ands, ors, shifts, bit checks) ... есть ли способ сделать это быстрее?

+1

Что заставляет вас думать, что простое приложение побитовой операции не будет достаточно быстро для вас? Эти операции, как правило, очень быстрые. – dmckee

+0

Это привлекло мое внимание, но вы не указали ссылку ... это правильный? en.wikipedia.org/wiki/FAST_protocol –

+0

@IraBaxter да, это правильно –

ответ

2

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

Насколько я вижу, есть три способа:

  • Просто сделай это, как вы описали ниже
  • использования рамок низкого уровня, таких как Boost::Spirit который имеет binary parsers.
  • Попробуйте использовать готовые библиотеки: например, QuickFAST - Реализация протокола FAST для собственных C++ и .NET.
+0

Как вы думаете, бинарные парсеры Boost :: Spirit будут быстрее, чем кастинг, смещение и ORing, а ++ - указатель? –

+0

Видимо, нет. Более того, Spirit: Qi (парсер, двоичный синтаксический анализатор) основан на синтаксисе EBNF, что подразумевает жесткий анализ и очень трудоемкий (по крайней мере, во время компиляции). Но использование двоичных синтаксических анализаторов может помочь вам уменьшить размер кода writen. – gahcep

1

Декодирование такого протокола, кажется, невозможно обойтись без линейного обхода битового OPS (НСР, ПРС, сдвиги, битовые чеки) ... есть ли способ сделать это быстрее?

БЫСТРЫЙ протокол кодирует значения с помощью стоп-битную подход, другими словами, он разбирает побайтно последовательно, пока не достигнет байта с 8 бит установлен в 1. Вы теряете немного в каждый байт делает что , но в целом это быстрый способ кодировать много разных полей, не требуя между ними разделительного байта.

Посмотрите on this article о поддержке FAST от CoralFIX. В нем есть пример кода Java для декодера FAST, сгенерированного из файла шаблона обмена XML.

Отказ от ответственности: Я - один из разработчиков CoralFIX.