Как передать информацию из 8-байтового массива в контейнеры данных с переменным битовым размером? - PullRequest
0 голосов
/ 15 июля 2009

У меня есть 8-байтовое сообщение, в котором различные фрагменты сообщения отображаются в данные различных типов (int, bool и т. Д.), И они различаются по размеру в битах (значение int составляет 12 бит в сообщении и т. Д. .). Я хочу передать только те биты, о которых идет речь, но я не уверен, что есть лучший способ. Моя текущая мысль состоит в том, чтобы создать битовый массив с внутренним вектором и иметь шаблонный метод доступа, чтобы получить значение, содержащееся в указанном типе. Хотя, когда я набираю это, я начинаю думать, что большой большой набор всех возможных типов может быть передан каждому элементу данных.

EDIT:

Сообщения содержат различные типы данных. Например, одно сообщение содержит 8-битное int и 5 1-битных bools, а другое сообщение содержит 16-битную метку времени (мой собственный класс) и 8-битное int.

Ответы [ 2 ]

1 голос
/ 15 июля 2009

Все ли сообщения одного формата / порядка? То есть. 12bitsInt | 8bitsChar | и т.д.. Если это так, то простым решением было бы установить соответствующие битовые маски для захвата каждого конкретного значения. То есть. если первые 12 бит (младший порядок) соответствуют целому числу, которое мы можем сделать:

__uint64 Message; // Obviously has data in it.
int IntPortion = Message & 0x00000111;

Который скопирует первые 12 битов Сообщения в первые 12 битов вашего целочисленного типа. Установите соответствующие битовые маски для каждого фрагмента сообщения и продолжайте. Если формат сообщения не является постоянным ... ну, мне нужно, чтобы вы уточнили, возможно, с примером сообщения. Также в библиотеке boost есть несколько хороших классов для работы с битами:

Динамический битовый набор

Может быть излишним, если формат постоянный.

0 голосов
/ 15 июля 2009

Вы смотрели на использование структуры с явными размерами элементов? Например, если у вас есть сообщение, где размеры полей:

  • 1-е поле - 12 бит
  • 2-е поле - 20 бит
  • 3-е поле - 4 бита
  • ...

Вы можете определить структуру как:

typedef struct {
  unsigned int field_1 : 12;
  unsigned int field_2 : 20;
  unsigned int field_3 : 4;
  /* etc */
} message_t;

Предполагая, что у вас есть сообщение в простом массиве символов, скопируйте данные в структуру message_t или приведите к message_t*: -

char buffer[8] = /* however it's populated */
message_t* message_ptr = &buffer;
int field1 = message->field_1;
int field2 = message->field_2;
...