Как передать информацию из 8-байтового массива в контейнеры данных переменного размера?

StackOverflow https://stackoverflow.com/questions/1128212

  •  13-09-2019
  •  | 
  •  

Вопрос

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

РЕДАКТИРОВАТЬ:

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

  • 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top