C 带或左移
显然,帧长度在协议中以第2和第3字节发送。该表达式从2个字节构建16位整数C 带或左移,c,C,显然,帧长度在协议中以第2和第3字节发送。该表达式从2个字节构建16位整数 *(pbBuffer+x)与pbBuffer[x]相同,因此字节#1左移8,字节#2添加到其中 如果您在pbBuffer中接收到,例如{0000 0000,0101 0101,1100 1100,…}(二进制),则将提取两个字节 i2c_receiveData(psDevice, prgDataRecv, &unRegLen); 计算结果将是: *(pbBuffer+1) = 0101 0101 *(pbBuf
*(pbBuffer+x)
与pbBuffer[x]
相同,因此字节#1左移8,字节#2添加到其中
如果您在pbBuffer
中接收到,例如{0000 0000,0101 0101,1100 1100,…}
(二进制),则将提取两个字节
i2c_receiveData(psDevice, prgDataRecv, &unRegLen);
计算结果将是:
*(pbBuffer+1) = 0101 0101
*(pbBuffer+2) = 1100 1100
*(pbBuffer+1)显然,帧长度在协议中以第2和第3字节发送。该表达式从2个字节构建16位整数
*(pbBuffer+x)
与pbBuffer[x]
相同,因此字节#1左移8,字节#2添加到其中
如果您在pbBuffer
中接收到,例如{0000 0000,0101 0101,1100 1100,…}
(二进制),则将提取两个字节
i2c_receiveData(psDevice, prgDataRecv, &unRegLen);
计算结果将是:
*(pbBuffer+1) = 0101 0101
*(pbBuffer+2) = 1100 1100
*(pbBuffer+1)在这种情况下,“帧长度”似乎存储在传递的缓冲区的偏移量1处
它似乎也是一个16位整数
为了得到一个可用的16位整数,必须从缓冲区解包。最好是转换并使用htons
/ntohs
,但我认为该体系结构是众所周知的,可移植性不是一个问题
对于输入,比如说,pbBuffer={0,1,2}
,结果是:
*(pbBuffer+1) << 8 = 0101 0101 0000 0000
(*(pbBuffer+1) << 8) | *(pbBuffer+2) = 0101 0101 1100 1100
。。。和或使用10b
:
100000000b
现在您从pbBuffer[1..2]
中的两个8位整数中得到了一个16位整数:
100000010b
在这种情况下,“帧长度”似乎存储在偏移量1处的传递缓冲区中
它似乎也是一个16位整数
为了得到一个可用的16位整数,必须从缓冲区解包。最好是转换并使用htons
/ntohs
,但我认为该体系结构是众所周知的,可移植性不是一个问题
对于输入,比如说,pbBuffer={0,1,2}
,结果是:
*(pbBuffer+1) << 8 = 0101 0101 0000 0000
(*(pbBuffer+1) << 8) | *(pbBuffer+2) = 0101 0101 1100 1100
。。。和或使用10b
:
100000000b
现在您从pbBuffer[1..2]
中的两个8位整数中得到了一个16位整数:
100000010b
将声明拆分为更小的部分:
100000010b = 0x102
*(pbBuffer+1)/*获取pbBuffer指针之外的字节值*/
(*(pbBuffer+1)将语句拆分为更小的部分:
100000010b = 0x102
*(pbBuffer+1)/*获取pbBuffer指针之外的字节值*/
(*(pbBuffer+1)感谢allot提供的详细答案。以上列位帮助我很好地理解感谢allot提供的详细答案。以上列位帮助我很好地理解感谢这意味着帧长度是258?这意味着帧长度是258?