在写 C#TCP 通信程序时,发送数据时,只能发送 byte 数组,处理起来比较麻烦不说,
如果是和 VC6.0 等写的程序通信的话,很多的都是传送结构体,在 VC6.0 中可以很方便的
把一个 char[]数组转换为一个结构体,而在 C#却不能直接把 byte 数组转换为结构体,要在
C#中发送结构体,可以按以下方法实现:
(1)定义结构体:
//命名空间
usingSystem.Runtime.InteropServices;
//注意这个属性不能少
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
structTestStruct
{
publicintc;
//字符串,SizeConst 为字符串的最大长度
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=256)]
publicstringstr;
//int 数组,SizeConst 表示数组的个数,在转换成
//byte 数组前必须先初始化数组,再使用,初始化
//的数组长度必须和 SizeConst 一致,例 test=newint[6];
[MarshalAs(UnmanagedType.ByValArray,SizeConst=6)]
publicint[]test;
}
2)结构体转 byte 数组:
////<summary>
///结构体转 byte 数组
///</summary>
///<paramname="structObj">要转换的结构体</param>
///<returns>转换后的 byte 数组</returns>
publicstaticbyte[]StructToBytes(objectstructObj)
{
//得到结构体的大小
intsize=Marshal.SizeOf(structObj);
//创建 byte 数组
byte[]bytes=newbyte[size];
//分配结构体大小的内存空间
IntPtrstructPtr=Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj,structPtr,false);
//从内存空间拷到 byte 数组
评论3