我正在Windows平台上使用C ++应用程序。有一个无符号字符指针,它以十进制格式获取字节。
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++;
}
答案 0 :(得分:1)
由于您要四乘四处理数组,因此建议您在for循环中将i
递增4。在删除不必要的index
变量后,您还可以避免混淆-您在循环中有i
,可以直接使用它,不是吗?
另一件事:当试图“连接”数字时,尽管它们的结果相同,但还是优先考虑按位或运算。
for (int i = 0 ; i <= 160; i += 4) {
float val = ((array[i + 2] << 8) | array[i + 3]) / 1000.0f;
}
答案 1 :(得分:1)
首先,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(即“跨度”)会更简单:
for (int i = 2; i < 160; i += 4) {
float Val = ((Array[i]<<8)+Array[i+1])/1000.0f;
}