加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 按位读取缓冲区

发布时间:2020-12-16 07:33:01 所属栏目:百科 来源:网络整理
导读:我有一个缓冲区,其中一些数据有不同的位大小(8位字段,然后是4位字段,然后是9位字段……). 我需要阅读它.如果某些库允许使用位级别的指针而不是字节级别来读取它,那将会很棒. 将缓冲区复制到结构体不是一种选择,因为在研究之后我需要使用#pragma pack()或类似
我有一个缓冲区,其中一些数据有不同的位大小(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

我能想到的唯一解决方案是复制到struct,pragma pack,然后去.但是我在之前的问题中被告知,由于便携性,这不是一个好的解决方案.但是,如果它能够拯救我,我愿意听到不同意见.

解决方法

使用位操作:

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读