i2c_receiveData(sDevice *psDevice, byte_t *pbBuffer, uint16_t *puiLen)
{
.
.
//extract the packet data length
unFrameLen = (*(pbBuffer+1) << 8) | *(pbBuffer + 2);
if(unFrameLen > *puiLen)
unFrameLen=*puiLen;
.
.
}在这里,这个语句是如何找到帧长度的?
unFrameLen = (*(pbBuffer+1) << 8) \x{e76f} *(pbBuffer + 2);
这里,pbBuffer是指向无符号char数组的指针。
呼叫功能是,
i2c_receiveData(psDevice, prgDataRecv, &unRegLen);发布于 2011-11-21 08:15:37
在这种情况下,“帧长”似乎存储在偏移量1处,存储到传递的缓冲区中。
它似乎也是一个16位整数.
为了获得一个可用的16位整数,您必须从缓冲区中解压。更好的方法是转换和使用htons/ntohs,但是我想这个体系结构是众所周知的,而且可移植性也不是一个问题。
对于例如pbBuffer = {0, 1, 2}的输入,这个结果是:
(1 << 8) | 2;..。这意味着:
(00000001b << 8) | 00000010b..。移位1b左8位:
100000000b..。和使用10b的OR-ing
100000010b现在,您可以从pbBuffer[1..2]中的两个8位整数中得到一个16位整数。
100000010b = 0x102发布于 2011-11-21 08:14:51
显然,帧长度在协议中以第2字节和第3字节发送。该表达式从2字节构建16位整数。
*(pbBuffer+x)与pbBuffer[x]相同,因此字节#1左移8,并将字节#2添加到其中。
如果在pbBuffer中接收到,例如{ 0000 0000, 0101 0101, 1100 1100, ...} (二进制),则提取的两个字节将为
*(pbBuffer+1) = 0101 0101
*(pbBuffer+2) = 1100 1100计算将是
*(pbBuffer+1) << 8 = 0101 0101 0000 0000
(*(pbBuffer+1) << 8) | *(pbBuffer+2) = 0101 0101 1100 1100按位排列的或(|)与这里的加法相同,因为(*(pbBuffer+1) << 8)的8个较低的位都是0。
请注意,细节在一定程度上取决于平台。
发布于 2011-11-21 08:16:13
将语句分解成较小的部分:
*(pbBuffer+1) /* gets the byte_t value one beyond the pbBuffer pointer */
(*(pbBuffer+1) << 8) /* shifts that byte eight bits left -- in essence
xxxxxxxx00000000 -- where xxx comes from pbBuffer+1 */
*(pbBuffer+2) /* gets the byte_t value two beyond the pbBuffer pointer */
(*(pbBuffer+1) << 8) | *(pbBuffer + 2)
/* xxxxxxxx00000000 | yyyyyyyy */
xxxxxxxxyyyyyyyy */这将将指定的两个字节重新构造为单个16位数据类型。这类操作在处理网络代码时特别常见,因为不同的机器有不同的字节顺序。不同的顺序意味着如果不使用网络字节顺序作为中间格式,大于一个字节的数字很难在网络上传递。(有些计算机本机以网络字节顺序工作,而另一些计算机则必须一直执行转换。)
https://stackoverflow.com/questions/8208877
复制相似问题