在寫C#TCP通信程序時,發(fā)送數(shù)據(jù)時,,只能發(fā)送byte數(shù)組,,處理起來比較麻煩不說,如果是和VC6.0等寫的程序通信的話,,很多的都是傳送結(jié)構(gòu)體,,在VC6.0中可以很方便的把一個char[]數(shù)組轉(zhuǎn)換為一個結(jié)構(gòu)體,,而在C#卻不能直接把byte數(shù)組轉(zhuǎn)換為結(jié)構(gòu)體,,要在C#中發(fā)送結(jié)構(gòu)體,,可以按以下方法實現(xiàn): 1)定義結(jié)構(gòu)體: //命名空間 using System.Runtime.InteropServices; //注意這個屬性不能少 [StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)] struct TestStruct { public int c; //字符串,SizeConst為字符串的最大長度 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string str; //int數(shù)組,,SizeConst表示數(shù)組的個數(shù),,在轉(zhuǎn)換成 //byte數(shù)組前必須先初始化數(shù)組,再使用,,初始化 //的數(shù)組長度必須和SizeConst一致,,例test = new int[6]; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public int[] test; }
2)結(jié)構(gòu)體轉(zhuǎn)byte數(shù)組: /// <summary> /// 結(jié)構(gòu)體轉(zhuǎn)byte數(shù)組 /// </summary> /// <param name="structObj">要轉(zhuǎn)換的結(jié)構(gòu)體</param> /// <returns>轉(zhuǎn)換后的byte數(shù)組</returns> public static byte[] StructToBytes(object structObj) { //得到結(jié)構(gòu)體的大小 int size = Marshal.SizeOf(structObj); //創(chuàng)建byte數(shù)組 byte[] bytes = new byte[size]; //分配結(jié)構(gòu)體大小的內(nèi)存空間 IntPtr structPtr = Marshal.AllocHGlobal(size); //將結(jié)構(gòu)體拷到分配好的內(nèi)存空間 Marshal.StructureToPtr(structObj, structPtr, false); //從內(nèi)存空間拷到byte數(shù)組 Marshal.Copy(structPtr, bytes, 0, size); //釋放內(nèi)存空間 Marshal.FreeHGlobal(structPtr); //返回byte數(shù)組 return bytes; }
3)byte數(shù)組轉(zhuǎn)結(jié)構(gòu)體: /// <summary> /// byte數(shù)組轉(zhuǎn)結(jié)構(gòu)體 /// </summary> /// <param name="bytes">byte數(shù)組</param> /// <param name="type">結(jié)構(gòu)體類型</param> /// <returns>轉(zhuǎn)換后的結(jié)構(gòu)體</returns> public static object BytesToStuct(byte[] bytes,Type type) { //得到結(jié)構(gòu)體的大小 int size = Marshal.SizeOf(type); //byte數(shù)組長度小于結(jié)構(gòu)體的大小 if (size > bytes.Length) ...{ //返回空 return null; } //分配結(jié)構(gòu)體大小的內(nèi)存空間 IntPtr structPtr = Marshal.AllocHGlobal(size); //將byte數(shù)組拷到分配好的內(nèi)存空間 Marshal.Copy(bytes,0,structPtr,size); //將內(nèi)存空間轉(zhuǎn)換為目標(biāo)結(jié)構(gòu)體 object obj = Marshal.PtrToStructure(structPtr, type); //釋放內(nèi)存空間 Marshal.FreeHGlobal(structPtr); //返回結(jié)構(gòu)體 return obj; } |
|