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的实现方式