我有一个缓冲区,其中一些数据有不同的位大小(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
,然后去。但是我在之前的问题中被告知,由于便携性,这不是一个好的解决方案。但是,如果它能够拯救我,我愿意听到不同意见。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
C中没有真正的按位方法(事实上,它甚至很难遇到仍然支持这些的嵌入式平台)。
您最好的选择是使用按位操作<< >> & and |
。
答案 2 :(得分:-1)
您可以使用位域定义结构:
struct Data
{
unsigned field1:8;
unsigned field2:6;
unsigned field3:4;
// etc
};
如果结构中所有位域的长度总和是8的倍数,那么这个技巧就可以工作。