uint8数据到嵌入式c中的uint32位



我通过uint8数据从微控制器获取输入数据,这些数据以0xff、0x2a…的形式传输。。。。这两个比特依次为高值和低值。我需要将其转换为uint-32 var,在那里我可以使用memcpy

示例

1C 1D 1E 1F 20 21 22 23      

如果这是传输的VALUES,我如何在一个uint32变量中获得它们,使用下面的方法,我只能获得最后两个比特,它只有23,而不是整个

void Func(const uint8_t * data){
uint32_t msgh =0;
uint32_t msgl=0;
uint32_t datah =0;
uint32_t datal=0;
for(int i= 0; i<dlc;i++){
msgh=*data >> 4;
msgl=*data & 0x0f;
// printf("DATA %x%x",msgh,msgl);  
memcpy(&datah, &msgh, 4);
memcpy(&datal, &msgl, 4);
// printf("msgl=%xn",msgl);           
data++;
}
printf("DATA%x%x",datah,datal);
}

不需要memcpy处理所有这些东西——提取字节的高半字节和低半字节可以如下完成:

uint32_t high = 0;
uint32_t low  = 0;
unsigned int offset = 0;
for(int i = 0; i < 8; ++i)
{
high |= ((uint32_t)(*data) >> 4)   << offset;
low  |= ((uint32_t)(*data) & 0x0f) << offset;
offset += 4;
++data;
}

请注意,您需要如何偏移偏移,以便半字节在各自的32位值内处于正确的位置。

请注意,这也假设传输数据的字节顺序为小端字节顺序(字节顺序必须是已知的,并作为通信协议定义的一部分进行修复!(。

大端订单略有不同:

uint32_t high = 0;
uint32_t low  = 0;
unsigned int offset = 32;
for(int i = 0; i < 8; ++i)
{
offset -= 4;
high |= (uint32_t)(*data >> 4)   << offset;
low  |= (uint32_t)(*data & 0x0f) << offset;
++data;
}

(好吧,也可以从28开始,在半字节提取后减去4,类似于LE变体——这个变体反映了我个人对二次方常数的偏好——运算次数无论如何都没有区别…(。

最后请注意,您可能更喜欢将转换和输出分离为单独的函数,以实现更好的可重用性,例如

void extract(uint8_t const* data, uint32_t* high, uint32_t* low)
{
// assign to *high and *low analogously to above
}
// assuming C code; if C++, prefer references:
void extract(uint8_t const* data, uint32_t& high, uint32_t& low);

// or alternatively:
typedef struct
{
uint32_t high;
uint32-t low;
} NibblesCombined;
NibblesCombined extract(uint8_t const* data)
{
// assign to the members of the struct analogously to above
}
// again assuming C; C++ could optionally return a std::pair instead!

最新更新