给定C中的数据流,我需要读取 x 位宽的 n 元素。 x 可以在1-64之间变化。我怎么用C做这个?我尝试了一些摆弄,但无法提出解决方案。
例如,对于数据流
01101010 11010101 11111111 00000010 00000000 10000000
==== ======
如果数据是10位宽,并且要解析的元素是第三个元素。预期数据应为1111 000000
。
数据流是字节可寻址的。
答案 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;
}