[英]What is the meaning of this pData[1+2*i]<<8|pData[2+2*i] C++ syntax?
什么是pData[1+2*i]<<8|pData[2+2*i]
的meqaning,其中pData[ ]
是包含BYTE数据的数组? 我在main函数中有以下功能
{
..........
....
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])
的含义。
任何人都可以帮帮我吗?
这似乎是用于从两个八位值合成16位值的代码。 如果你注意,那么数学就有了表格
(a << 8) | b
适用于a和b。 第一部分(a << 8)取a中的8位并将它们向上移动8个位置,得到16位值,其前8位是来自a的位,其后8位全部为0。 在这个新值和b的值之间应用按位OR运算符会创建一个新的16位值,其前8位是a的位(因为OR步骤的零扩展b使这些位保持不变)并且其低8位是b的位,因为OR的零位与b的位产生b。
我认为@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个char并将它移动24位:
例如
如果pcData[3]
是10110001那么现在就是
10110001000000000000000000000000
它需要这个32位值,然后将它与pcData [2]进行OR运算,移位16位 - 这意味着如果pcData[2]
为11111111
则32位值现在为:
10110001111111110000000000000000
依此类推pcData[1]
和pcData[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不会被添加到“修复”字节序问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.