C# 实现C的Union联合体

前言

在使用STM32给上层Unity发串口消息的时候,下位机使用了C的Union联合体作为数据类型,而Unity使用的C#并没有Union联合体这一概念,所以记录下来。

联合体Unino概念及C中的实现

在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。

“联合”是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的(还有一个节省空间的类型:位域)。 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。
参考: C深入理解 联合体(union)的使用方法及其本质

代码

联合中每个数据成员都在相同的内存地址开始,所以我们要通过[FieldOffset(0)]应用到UninoCSharp的每一个成员,意思就是让这些成员处于同一个开始位置。当然,我们得事先告诉.NET这些成员的内存布局由我们来作主,所以要使用LayoutKind.Explicit枚举然后传递给StructLayoutAttribute,并应用到UninoCSharp上,这样.Net就不会再干涉该struct的成员在内存中的布局了。并且我定义了UninoCSharp的Size为4,当然你也可以不定义UninoCSharp的Size。

//定义4位联合体
[StructLayout(LayoutKind.Explicit, Size = 4)]
struct UninoCSharp
{
	//设置联合体的每一位
    [FieldOffset(0)]
    public byte b0;
    [FieldOffset(1)]
    public byte b1;
    [FieldOffset(2)]
    public byte b2;
    [FieldOffset(3)]
    public byte b3;
 	//得到对应的int值
    [FieldOffset(0)]
    public int i;
 	//得到对应的float值
    [FieldOffset(0)]
    public float f;
}

参考: C#联合Union的实现方式

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值