2015-01-14 5 views
1

Мне нужно перенести некоторые данные по относительному медленному (вплоть до 1 Кбит/с) соединению. Я прочитал, что кодирование буферов протокола Googles является эффективным. Thats true для большинства моих данных, но не для булевых значений, особенно если это повторяющееся поле. Проблема заключается в том, что мне приходится передавать вместе с другими данными указанное число (15) логических значений каждые 50 миллисекунд. Протобуф кодирует каждое логическое значение в один байт для идентификатора поля и одного байта для логического значения (0x00 или 0x01), что приводит к 30 байтам данных для 15 булевых значений.Буферы протоколов - наилучшая практика для повторяющихся логических значений

Так что я ищу лучший способ кодирования этого сейчас. У кого-то тоже была эта проблема? Какова была бы лучшая практика для достижения эффективной кодировки для этой ситуации?

Моей идеей было использовать нумерованный тип данных (uint32) и ручной кодировать данные, для каждого bool один бит целого. Любые отзывы об этой идее?

+0

Я хотел бы использовать в этом случае uint16. uint16_t rightmost16bits (uint32_t i) { return (uint16_t) (i >> 16); } – Nostradamus

+0

FWIW Я раньше использовал протокольные буферы - я бы пошел с вашей идеей uint32; это звучит более эффективно. – splig

+0

Является ли '[упакованный = истина]' для вашего повторяющегося логического поля уменьшением количества байтов? –

ответ

2

В Protobuf лучше всего использовать целое битовое поле. Если у вас более 64 бит, используйте поле bytes (и вручную упакуйте биты).

Обратите внимание, что Cap'n Proto будет упаковывать логические значения (в обеих структурах и списках) как отдельные биты, и поэтому может стоить посмотреть.

Однако, если вы сильно ограничены полосой пропускания, возможно, лучше всего разработать собственный протокол. Большинство из этих схем сериализации объединяют немного места для простоты использования (особенно когда дело касается перекоса версии), но если ваш случай может быть более важным сосредоточиться исключительно на размере. Формат пользовательского сообщения, который содержит только некоторые биты, должен быть достаточно простым, чтобы поддерживать и может быть упакован так же сильно, как вы хотите.

(Раскрытие информации:. Я являюсь автором Cap'n Proto, а также наиболее открытым исходным кодом от Google Protobuf код)

Смежные вопросы