我有一个只能以 8 位字节寻址的数据流,我想将其解析为 6 位元素并将其存储到一个数组中。有什么最知名的方法可以做到这一点吗?
11110000 10101010 11001100
进入
像这样的数组
111100|001010|101011|001100
(可以有零填充,只需要这样寻址)
数据是一个 8 位数组,也是 6 位的倍数,不是真的无穷无尽
最佳答案
取决于一个字节在您的特定架构上有多少位。在六位架构上,它非常简单:-)
假设一个每字节 8 位的架构,你将不得不按照以下方式做一些事情:
int sixbits(unsigned char* datastream, unsigned int n) {
int bitpos = n*6;
return (datastream[bitpos/8] >> bitpos%8) // lower part of the five bit group
+ (datastream[bitpos/8+1] << 8-bitpos%8) // if bitpos%8>2, we need to add some carry bits from the next char
& 0x3f; // and finally mask the lowest 6 bits
}
其中 n 是第 n 个 6 位组。任何像样的编译器都会用移位代替除法,用与代替模数。只需在循环中使用此函数即可填充目标数组。
关于c - 如何从字节可寻址数组中解析出 n 位元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1870237/