• 正文
  • 相关推荐
申请入驻 产业图谱

联合体和结构体一起解析数据

13小时前
247
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

联合体是一种数据结构,其内部的成员共享同一块内存。应用这种方式可以简化多种复杂数据的处理。

比如接收一段16进制到的数据,根据帧头不同数据的含义不同需要进行解析;第一个字节为0x01时,后两个字节代表一个含义;第一个字节为0x02时,后四个字节代表另一个含义;第一个字节为0x03时,后3个字节代表另一个含义。首先定义几个结构体

struct test_data1
{
uint8_t header;
uint16_t data_xxx;
...
}__attribute__ ((__packed__));
struct test_data2
{
uint8_t header;
uint32_t data_xxx;
...
}__attribute__ ((__packed__));
struct test_data3
{
uint32_t header:8;
uint32_t data_xxx:24;
...
}__attribute__ ((__packed__));

typedef union


{

uint8_t data_bytes[100];

struct test_data1 analysis_data1;

struct test_data2 analysis_data2;

} data;

使用__attribute__ ((__packed__))使字节不对齐,使用位域来表示三个字节,__attribute__ ((__packed__))和结构体位域可以参考:

结构体位域和__attribute__ ((__packed__))一起用

根据数据值直接使用结构体赋值

memcpy(data.data_bytes, receive, 100);

if(data.data_bytes[0] == 0x01)

{

xxx = data.analysis_data1.data_xxx

}

else if(data.data_bytes[0] == 0x02)

{

xxx = data.analysis_data2.data_xxx

}
else if(data.data_bytes[0] == 0x03)
{
xxx = data.analysis_data3.data_xxx
}

这样使用联合体方便简化数据解析。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录