C# 联合体的理解,以及坑
联合体是一段连续的在内存的物理地址中的结构,在C和C++中可以用union关键字来声明,使用方法和struct相似
C#虽然没有联合体,但是联想一下联合体的本质,也是有办法构造一个“联合体”的
首先,先写出自己想要的结构体,也就是struct
比如:
public struct IpAddress { public int Address; public byte Byte1; public byte Byte2; public byte Byte3; public byte Byte4; }
之后将其改为:
[StructLayout(LayoutKind.Explicit)] public struct IpAddress { [FieldOffset(0)] public int Address; [FieldOffset(0)] public byte Byte1; [FieldOffset(1)] public byte Byte2; [FieldOffset(2)] public byte Byte3; [FieldOffset(3)] public byte Byte4; }
Marshal.PtrToStructure(buffer, strcutType); 直接闪退
至今我也不知道如何解决
纯数组的问题解决了,可以使用,但使用字符串和结构体(在实际运行时)仍是不可行的
破案了,在C#中,字符串和结构体都是引用类型,而在联合体中使用这些东西,虽然在理论上是可行的,编译上是可行的,但是在实际操作中会出现以下这些情况:
1.你把结构体的偏移量和其他某个变量设置相同,会在运行开始之时报错,大致意思是偏移量不能相同(偏移量都不能相同,那我还用联合体干嘛???)
2.把结构体的偏移量和其他变量相隔一点距离,这个距离在程序上不一定是一样,我测试了很多遍
我的结构体大小为28,在联合体内的排序是第二个变量;第一个是个char型的数组,长度为56,偏移量为0(就是开头)
我把结构体的偏移量一一测试,最终确定为[FieldOffset(4)]和[FieldOffset(20)]这两个值没问题,中间还有些可以取值,但我测的最长的是20,最短的是4
运行之后是成功的,能看到数据,一部分的数据也重叠成功了,我思考了很久那4个长度字符到底是啥,最终都没想通。
在网上找了些理解和答案,看看吧,能解惑,解决是不指望了。。。。
https://www.codenong.com/15392054/
https://www.zhihu.com/question/458430830/answer/1877033308
参考资料:

浙公网安备 33010602011771号