按位读取缓冲区

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,然后进行操作。但是在之前的问题中,有人告诉我这不是一个好的解决方案,因为它不够通用。如果有更好的建议可以帮助我,我很愿意听取不同的意见。


没有这样的标准事物。编写一个函数,解析此数据格式并将其存储在结构体中。 - Kiril Kirov
如果您想直接将缓冲区中的相同内存复制到结构体上,则需要使用pragma pack - Kiril Kirov
@KirilKirov 我刚刚编辑了一个示例,展示了为什么我想避免手动提取每个数据字段。 - Roman Rdgz
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;
}

0
你可以使用位域定义一个结构体:
struct Data
{
unsigned field1:8;
unsigned field2:6;
unsigned field3:4;
// etc
};

如果结构体中所有位域的长度之和是8的倍数,那么这个技巧就会起作用。

0

在C语言中,实际上并没有真正的位运算方法(事实上,即使是嵌入式平台也很难找到支持这些方法的平台)。

你最好使用位运算操作符<< >> & 和 |


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接