联合体的妙用

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数据拆分为四个字节,操作结构体就可以发送或接收这四个字节,只是要主要高低字节序。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值