联合体的妙用

1. 联合体的定义

        联合体在C中比较常用,它不像结构体一样,每个成员占用各自的存储空间,相互不影响,它的所有成员占用同一段内存空间,修改一个成员影响其它所有成员。联合体的定义和使用与结构体一样。

2. 联合体的应用

(1)判断大小端

union IsLittle_Endian{
    int  a;
    char c;
};

union IsLittle_Endian un;
un.a =1;
if(un.c == 1)
{
    //小端
}
else
{
    //大端
}

(2)数据的拆分与组合

        这个经常在通信协议代码中用的比较多,比如数据解析与发送。

union bit32_data
{
    uint32_t data;
    struct 
    {
        uint8_t byte0;
        uint8_t byte1;
        uint8_t byte2;
        uint8_t byte3;
    }byte;
};

union bit32_data num; 

if(数据拆分)
{
    num.data = 0x12345678;
    //num.byte.byte0 = 0x78;
    //num.byte.byte1 = 0x56;
    //num.byte.byte2 = 0x34;
    //num.byte.byte3 = 0x12;
}
else if(数据组合)
{
    num.byte.byte0 = 0x78;
    num.byte.byte1 = 0x56;
    num.byte.byte2 = 0x34;
    num.byte.byte3 = 0x12;

    //num.data = 0x12345678;
}

(3)结构体与缓冲区

        这种应用也是常应用与通信协议组包与发送过程,

union SendOrRev_data
{
     unsigned char Buffer[8];
     struct 
     {
          unsigned char data1;
          unsigned char data2;
          unsigned char data3;
          unsigned char data4;
          // ...
     }data;
};

        Struct里的内容可以是单一数据,也可以是协议帧各个字段,比如校验和等。如果我们要发送数据,我们可以操作结构体,填充结构体,最后发送的时候把Buffer传给发送函数即可;如果我们是接收,我们就把接收的数据存放在Buffer中,然后使用结构体解析数据和使用数据。

(4)传输浮点数据

union float_data 
{
     float f;
     struct
     {
          unsigned char byte[4];
     };
};

        我们在协议传输数据时,常常要传输浮点数据,我们可以使用专用的工具转换,但是直接用这个技巧更加方便,可以把一个float数据拆分为四个字节,操作结构体就可以发送或接收这四个字节,只是要主要高低字节序。

猜你喜欢

转载自blog.csdn.net/fengel_cs/article/details/120649190