一般,定长的可以用
public byte[] StructToBytes(object obj)
9 {
10 //得到结构体的大小
11 int size = Marshal.SizeOf(obj);
12 //创建byte数组
13 byte[] bytes = new byte[size];
14 //分配结构体大小的内存空间
15 IntPtr structPtr = Marshal.AllocHGlobal(size);
16 //将结构体拷到分配好的内存空间
17 Marshal.StructureToPtr(obj, structPtr, false);
18 //从内存空间拷到byte数组
19 Marshal.Copy(structPtr, bytes, 0, size);
20 //释放内存空间
21 Marshal.FreeHGlobal(structPtr);
22 //返回byte数组
23 return bytes;
24
25 }
但是不定长的结构有问题,不知怎么实现。
你所谓的不定长的结构体,其实就是结构体成员包含string,Array成员的结构体.
1 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 1, Pack = 1)]
2 public class Packet
3 {
4 // string 具有默认封送行为,但是可以通过 MarshalAs 属性,限定其封送的行为。
5 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
6 public string IpAddr;
7
8 // 值类型具有默认封送行为,不用指定 MarshalAs 属性。
9 public int DataLength;
10
11 // 数组类型,需要指定数组的大小。
12 [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]
13 public byte[] Data;
14 }
这个问题,同问。