Как мне распаковать биты из stream_data структуры в коде c? - PullRequest
2 голосов
/ 15 июня 2010

Ex.

typedef struct 
{
  bool streamValid;
  dword dateTime;
  dword timeStamp;
  stream_data[800];
} RadioDataA;

Ex. Где stream_data[800] содержит:

**Variable**  **Length (in bits)**
packetID        8
packetL         8
versionMajor    4
versionMinor    4
radioID         8

и т.д ..

Мне нужно написать:

void unpackData(radioDataA *streamData, MA_DataA *maData)
{
  //unpack streamData (from above) & put some of the data into maData
  //How do I read in bits of data? I know it's by groups of 8 but I don't understand how.
  //MAData is also a struct.
}

Ответы [ 3 ]

1 голос
/ 15 июня 2010

Ваши типы противоречивы или не определены. Я полагаю, что вы пытаетесь извлечь упакованные данные из потока байтов. Если это так, предположим, что buf содержит ваши данные, упакованные в порядке с указанной длиной. Следующий код должен затем правильно извлечь каждое поле:

int packetID = buf[0];
int packetL = buf[1];
int versionMajor = (buf[2] >> 4);
int versionMinor = (buf[2] & 0x0F);
int radioID = buf[3];

Как видите, выровненные по байту значения являются прямыми копиями. Однако 4-битные поля должны быть замаскированы и / или сдвинуты, чтобы извлечь только нужные данные. Для получения дополнительной информации о битовых операциях см. Превосходные битовые хедж-хаки фрагментов кода.

1 голос
/ 15 июня 2010

Я не уверен, что правильно понял, но почему вы не можете сделать просто:

memcpy(maData, streamData->stream_data, sizeof(MA_DataA));

Это полностью скопирует данные, содержащиеся в массиве байтов, в структуру.

0 голосов
/ 15 июня 2010

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

stream_data [800] имеет тип байта. К сожалению !!

Я не думаю, что memcopy будет работать, потому что это не прямой перевод 1: 1.

надеюсь, вы понимаете, о чем я!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...