4

我有一个缓冲区,其中包含一些不同位大小的数据(8 位字段,然后是 4 位字段,然后是 9 位字段......)。

我需要阅读它。如果有一些库允许使用位级别的指针而不是字节级别的指针来读取它,那就太好了。

将缓冲区复制到结构不是一种选择,因为在研究之后我需要使用#pragma pack()或类似的东西,并且不能移植。

任何的想法?

编辑:我将尝试用一个例子来解释我的问题的严重性:

field1: 8 bits --> ok, get first byte
field2: 6 bits --> ok, second byte, and a mask
field3: 4 bits --> gets harder, i have to get 2 bytes, apply 2 different masks, and compose
field4 
... 
field 15: 9 bits ---> No idea of how to do it with a loop to avoid writing manually every single case

我能想到的唯一解决方案是复制到结构,pragma pack然后继续。但我在之前的问题中被告知,由于可移植性,这不是一个好的解决方案。但如果它拯救我,我愿意听到不同的意见。

4

3 回答 3

3

使用位操作:

unsigned char[64] byte_data;
size_t pos = 3; //any byte
int value = 0; 
int i = 0;
int bits_to_read = 9;
while (bits_to_read) {
    if (i > 8) {
      ++readPos;
      i = 0;
    }
    value |= byte_data[pos] & ( 255 >> (7-i) );
    ++i;
    --bits_to_read;
}
于 2012-10-24T14:08:06.727 回答
0

C 中没有真正的按位方法(事实上,很难找到仍然支持这些方法的嵌入式平台)。

你最好的选择是使用按位运算<< >> & and |

于 2012-10-24T14:09:02.150 回答
0

您可以使用位域定义结构:

struct Data
{
unsigned field1:8;
unsigned field2:6;
unsigned field3:4;
// etc
};

如果结构中所有位域的长度之和是 8 的倍数,则此技巧将起作用。

于 2012-10-24T14:16:28.273 回答