首页 新闻 赞助 找找看

c#中,socket封送结构体,其中包含不定长的字段,怎样将此结构体转化为byte数组。

0
悬赏园豆:50 [已关闭问题]

一般,定长的可以用
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 }

但是不定长的结构有问题,不知怎么实现。

cyb的主页 cyb | 初学一级 | 园豆:100
提问于:2010-01-06 00:02
< >
分享
其他回答(1)
0

你所谓的不定长的结构体,其实就是结构体成员包含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 }
Launcher | 园豆:45045 (高人七级) | 2010-01-06 09:36
SizeConst其实还是确定了大小的,如果超出SizeConst在封送时还是有问题的
支持(0) 反对(0) cyb | 园豆:100 (初学一级) | 2010-01-06 13:57
0

这个问题,同问。

Climb | 园豆:202 (菜鸟二级) | 2018-02-05 14:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册