我的功能如下:
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位长度并找出其值。我对numbershift有疑问并且我的功能是否正常工作?如果有人确认这一点会很棒。谢谢你。
答案 0 :(得分:1)
你的问题在于你设置面具的方式:
for(i=0;i<16;i++)
{
if(length == i)
mask|=(1<<i); /* BTW, mask is not initialized */
}
简单等同于:
mask |= (1 << length);
只会在你的掩码中设置一个位。因此,要么在mask
之后从for
中对一个进行子结构,要么直接设置它:
#define UINT16_WIDTH 16
mask = (1u << (length & (UINT16_WIDTH - 1))) - 1u;