从C中的数据流中读取n位元素

时间:2014-08-13 18:06:43

标签: c parsing bit-fields

给定C中的数据流,我需要读取 x 位宽的 n 元素。 x 可以在1-64之间变化。我怎么用C做这个?我尝试了一些摆弄,但无法提出解决方案。

例如,对于数据流

01101010 11010101 11111111 00000010 00000000 10000000
                      ==== ======

如果数据是10位宽,并且要解析的元素是第三个元素。预期数据应为1111 000000

数据流是字节可寻址的。

2 个答案:

答案 0 :(得分:1)

首先找出最重要的位代表什么。具体来说,它是否代表比特流中的第0位或第7位。

要查找n th 元素,您需要找到它开始的字节((n*x)/8),从该字节中获取相应的位,然后获取来自后续字节或字节的剩余位。

但是,应从字节中取出哪些位取决于最高位代表的含义。

答案 1 :(得分:1)

#include <stdio.h>
#include <stdint.h>

uint64_t bit_slice(const uint8_t ds[], int start, int end){
    //index start, end {x | 1 <= x <= 64 }
    uint64_t s = 0;//memcpy(&s, ds, 8);
    int i, n = (end - 1) / 8;
    for(i = 0; i <= n; ++i)
        s = (s << 8) + ds[i];
    s >>= (n+1) * 8 - end;
    uint64_t mask = (((uint64_t)1) << (end - start + 1))-1;//len = end - start + 1
    s &= mask;
    return s;
}

int main(void){
    uint8_t data[8] = {
        0b01101010, 0b11010101, 0b11111111, 0b00000010, 0b00000000, 0b10000000 //0b... GCC extention
    };
    unsigned x = bit_slice(data, 21, 30);
    printf("%X\n", x);//3C0 : 11 1100 0000
    return 0;
}