我在从特定字节中提取特定数量的位时遇到问题。假设我们有这样的案例:
(我假设我从0开始计算字节/位(我从流中接收3个字节,并想读取从第一个字节的第7位开始的11位:在第二个字节的5位结束,我想将其存储在的某个地方
一些可视化:
0th byte 1st byte 2nd byte
|7|6|5|4|3|2|1|0|#|7|6|5|4|3|2|1|0|#|7|6|5|4|3|2|1|0|
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
我知道比特转换是一个方向,但我在这个话题上缺乏经验,我真的很好奇经验丰富的开发人员的意见
编辑:很抱歉之前没有指定它-语言是C++,但我不能使用像"位集";。
";n〃;以及";m〃;可以是任何数字,例如:n=17m=5。另一个假设是数据需要是连续的——这意味着最终我需要11位连续的数据。
我想做的是这样的事情:
buf[0] << ((byteCount - 1) - index) * stepWidth;
这给了我完整的第一个/第二个字节。最后读取的比特应该是"0";合并的";作为一个变量,有点像:
int buf[1] = variable with 8 bits;
int buf[2] = variable with 3 bits;
mergedBuf = buf[1] + buf[1] // "+" means merging, not adding values
C++在标准库中有一个不错的类:
https://www.cplusplus.com/reference/bitset/bitset/
如果是C,则可以使用位掩码和&(和(操作。类似:
unsigned char buf[3]; // let's say this is your buffer;
int _2nd_byte_value = buf[1] & 0xFF; // since you want to get all bits of 2nd byte;
int _3rd_byte_value = (buf[2] & 0xE0) >> 5; // first mask then shift;
然后,您可以随心所欲地操纵这些值。