前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >联合体和结构体一起解析数据

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

作者头像
用户9736681
发布2023-09-01 13:27:13
1520
发布2023-09-01 13:27:13
举报
文章被收录于专栏:嵌入式随笔嵌入式随笔

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

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

代码语言:javascript
复制
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__))一起用

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

代码语言:javascript
复制
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
}

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档