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

2023-09-01 13:27:13 浏览数 (2)

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

比如接收一段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
}

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

0 人点赞