首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >左移或左移

左移或左移
EN

Stack Overflow用户
提问于 2011-11-21 08:07:13
回答 3查看 177关注 0票数 1
代码语言:javascript
复制
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数组的指针。

呼叫功能是,

代码语言:javascript
复制
i2c_receiveData(psDevice, prgDataRecv, &unRegLen);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-21 08:15:37

在这种情况下,“帧长”似乎存储在偏移量1处,存储到传递的缓冲区中。

它似乎也是一个16位整数.

为了获得一个可用的16位整数,您必须从缓冲区中解压。更好的方法是转换和使用htons/ntohs,但是我想这个体系结构是众所周知的,而且可移植性也不是一个问题。

对于例如pbBuffer = {0, 1, 2}的输入,这个结果是:

代码语言:javascript
复制
(1 << 8) | 2;

..。这意味着:

代码语言:javascript
复制
(00000001b << 8) | 00000010b

..。移位1b左8位:

代码语言:javascript
复制
100000000b

..。和使用10b的OR-ing

代码语言:javascript
复制
100000010b

现在,您可以从pbBuffer[1..2]中的两个8位整数中得到一个16位整数。

代码语言:javascript
复制
100000010b = 0x102
票数 4
EN

Stack Overflow用户

发布于 2011-11-21 08:14:51

显然,帧长度在协议中以第2字节和第3字节发送。该表达式从2字节构建16位整数。

*(pbBuffer+x)pbBuffer[x]相同,因此字节#1左移8,并将字节#2添加到其中。

如果在pbBuffer中接收到,例如{ 0000 0000, 0101 0101, 1100 1100, ...} (二进制),则提取的两个字节将为

代码语言:javascript
复制
*(pbBuffer+1) = 0101 0101
*(pbBuffer+2) = 1100 1100

计算将是

代码语言:javascript
复制
 *(pbBuffer+1) << 8                  = 0101 0101 0000 0000
(*(pbBuffer+1) << 8) | *(pbBuffer+2) = 0101 0101 1100 1100

按位排列的或(|)与这里的加法相同,因为(*(pbBuffer+1) << 8)的8个较低的位都是0。

请注意,细节在一定程度上取决于平台。

票数 2
EN

Stack Overflow用户

发布于 2011-11-21 08:16:13

将语句分解成较小的部分:

代码语言:javascript
复制
 *(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位数据类型。这类操作在处理网络代码时特别常见,因为不同的机器有不同的字节顺序。不同的顺序意味着如果不使用网络字节顺序作为中间格式,大于一个字节的数字很难在网络上传递。(有些计算机本机以网络字节顺序工作,而另一些计算机则必须一直执行转换。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8208877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档