我正在使用Windows平台上的C ++应用程序。有一个unsigned char指针,以十进制格式获取字节。
unsigned char array[160];
这将是这样的值,
array[0] = 0
array[1] = 0
array[2] = 176
array[3] = 52
array[4] = 0
array[5] = 0
array[6] = 223
array[7] = 78
array[8] = 0
array[9] = 0
array[10] = 123
array[11] = 39
array[12] = 0
array[13] = 0
array[14] = 172
array[15] = 51
.......
........
.........
and so forth...
我需要取4个字节的每个块,然后计算其十进制值。
因此,对于例如,对于前4个字节,组合的十六进制值是B034。现在我需要将其转换为十进制并除以1000。
如您所见,对于每个4字节块,前2个字节始终为0.因此我可以忽略它们,然后取该块的最后2个字节。所以从上面的例子来看,它是176和52。
有很多方法可以做到这一点,但我想通过使用位运算符来实现。
以下是我尝试过的,但它不起作用。基本上我忽略了每4字节块的前2个字节。
int index = 0
for (int i = 0 ; i <= 160; i++) {
index++;
index++;
float Val = ((Array[index]<<8)+Array[index+1])/1000.0f;
index++;
}
由于您要对数组进行4×4处理,因此我建议您在for循环中将i
增加4。删除不必要的index
变量后,你也可以避免混淆 - 你在循环中有i
并且可以直接使用它,不是吗?
另一件事:当你试图“连接”数字时,首选按位OR或算术加法,尽管它们的结果是相同的。
for (int i = 0 ; i <= 160; i += 4) {
float val = ((array[i + 2] << 8) | array[i + 3]) / 1000.0f;
}
首先,i <= 160
是一个迭代太多。
其次,你的增量是错误的;对于index
,你有
Iteration 1:
1, 2, 3
And you're combining 2 and 3 - this is correct.
Iteration 2:
4, 5, 6
And you're combining 5 and 6 - should be 6 and 7.
Iteration 3:
7, 8, 9
And you're combining 8 and 9 - should be 10 and 11.
每次迭代需要增加四次,而不是三次。
但我认为在你感兴趣的第一个索引开始循环更简单 - 2 - 并直接增加4(“stride”):
for (int i = 2; i < 160; i += 4) {
float Val = ((Array[i]<<8)+Array[i+1])/1000.0f;
}