pData[1+2*i]<<8|pData[2+2*i]
的含义是什么pData[ ]
是包含BYTE数据的数组?
我有以下功能
在主要功能
{
..........
....
BYTE Receivebuff[2048];
..
ReceiveWavePacket(&Receivebuff[i], nNextStep);
....
...
..
}
其中Receivebuff是BYTE类型的数组。
ReceiveWavePacket(BYTE * pData, UINT nSize)
{
CString strTest;
for(int i = 0 ; i < 60 ; i++)
{
strTest.Format("%d\n",(USHORT)(pData[1+2*i]<<8|pData[2+2*i]));
m_edStatData.SetWindowTextA(strTest);
}
}
我想知道“,(USHORT)(pData[1+2*i]<<8|pData[2+2*i])
。
任何人都可以帮助我吗?
答案 0 :(得分:12)
这似乎是用于从两个八位值合成16位值的代码。如果你注意,数学的形式是
(a << 8) | b
对于合适的a和b。第一部分(a <&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&gt在这个新值和b的值之间应用按位OR运算符会创建一个新的16位值,其前8位是a的位(因为OR步骤的零扩展b使这些位保持不变)并且其低8位是b的位,因为将零位与b的位进行或运算得到b。
答案 1 :(得分:0)
我认为@templatetypedef是正确的,它看起来像通过对两个8位值进行逻辑“或”运算来创建16位值的代码。 (因为它是你的BYTE数组中的两个元素)。
两位的逻辑“或”基本上意味着,如果其中任何一位为1
,则结果为1(“此位或该位”)。
作为另一个例子,看看这个函数,它接受一个指向char(大小为8位)的指针,并返回一个整数(在这个实现中,这意味着32位)。
int Read32(const char *pcData)
{
return ( (pcData[3]<<24) & 0xff | pcData[2]<<16 | pcData[1]<<8 | pcData[0]);
}
如果pcData
是指向char
数组的指针,则它会找到它找到的第3个字符,并将其移位24位:
e.g。
如果pcData[3]
是10110001,那么它现在是
10110001000000000000000000000000
它需要这个32位值,然后将它与pcData [2]进行OR运算,移位16位 - 这意味着如果pcData[2]
为11111111
则32位值现在为:
10110001111111110000000000000000
等pcData[1]
和pcData[0]
。
答案 2 :(得分:0)
@ templatetypedef的答案是正确的,但还有另一件有趣的事情发生在这里:
(pData[1+2*i]<<8|pData[2+2*i])
i
从0到59,所以这将处理60个字,从pData[1]
开始(1 + 2 * 0
== 1)。
这意味着数组中的第一个字节永远不会被处理,这似乎很奇怪。为什么这不是更自然的pData[2*i]<<8|pData[2*i+1]
?
一种可能性:字数据可以2种方式存储在字节流中:字0xAA11可以存储为0xAA 0x11或0x11 0xAA。想象一下,这是后者。
单词:0xAA11 0xBB22 0xCC33 ...
字节流将为11 AA 22 BB 33 CC ...
使用'自然'方法进行解析会产生0x11AA 0x22BB...
,这显然是错误的。
此代码将打印0xAA22 0xBB33, 0xCC44 ....
,这可能会通过快速查看完整性检查,但实际上完全不正确。
我希望额外+1不会被添加到“修复”字节序问题。