首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C从框架中提取数据

使用C从框架中提取数据
EN

Stack Overflow用户
提问于 2018-05-09 10:37:00
回答 1查看 66关注 0票数 0

我的职能如下:

代码语言:javascript
复制
union u_t
{
  uint16_t u16;
  uint8_t u8[2];
};

uint16_t Frame2Data(uint8_t *data,uint8_t startBit,uint16_t length)
{
  uint16_t mask;
  uint8_t start;
  uint8_t firstByte,offset;
  uint8_t numShift;
  union u_t ut;

  for(i=0;i<16;i++)
  {
    if(length == i)
    mask|=(1<<i);
  }

  firstByte = startBit / 8;
  offset = (firstByte+2) * 8;
  start = startBit + length;
  numShift = offset - start;
  ut.u8[1] = data[firstByte];
  ut.u8[0] = data[firstByte+1];
  return (ut.u16 >> numShift) & mask;
}

开始位为46,长度为7,以8字节为单位的数据必须传递为0x00 0x09 0x03 0x84 0x03 0x70 0x02 0xA8。我必须提取开始位46和长度7位的数据,并找出它的值。我对数字移位有疑问,我的功能是否正确?如果有人事先确认了this.Thanks,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-09 11:15:23

你的问题在于你设置面具的方式:

代码语言:javascript
复制
for(i=0;i<16;i++)
{
    if(length == i)
    mask|=(1<<i); /* BTW, mask is not initialized */
}

只相当于:

代码语言:javascript
复制
mask |= (1 << length);

这只会在你的面具里设置一点。所以,要么在mask之后从for中子结构一个,要么直接设置它:

代码语言:javascript
复制
#define UINT16_WIDTH 16
mask = (1u << (length & (UINT16_WIDTH - 1))) - 1u;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50251328

复制
相关文章

相似问题

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