词条 | 周朔鹏 |
释义 | using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace ServerSocket { /// <summary> /// 内存处理,组织内存拓扑结构并定义处理函数 /// 作者:周朔鹏 /// 编写时间:2010-6-10 /// </summary> public static class PLCStruct { //将结构体声明为Struct和class其行为完全一致,但是Struct中不能用new创建对象,class中可以,但是,在此应用中创建对象没有实际价值。 /*[StructLayout(LayoutKind.Sequential, Pack = 1)] public class Socket_struct { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public byte[] bByte;// = new byte[20]; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public Int32[] dwDword;// = new UInt32[20]; }*/ [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct Socket_struct { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public byte[] bByte; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public Int32[] dwDword; } } public class StructToFromByte { public static object BytesToStuct(byte[] bytes, Type type) { //得到结构体的大小 int size = Marshal.SizeOf(type); //byte数组长度小于结构体的大小 if (size > bytes.Length) { //返回空 return null; } //分配结构体大小的内存空间 IntPtr structPtr = Marshal.AllocHGlobal(size); //将byte数组拷到分配好的内存空间 Marshal.Copy(bytes, 0, structPtr, size); //将内存空间转换为目标结构体 object obj = Marshal.PtrToStructure(structPtr, type); //释放内存空间 Marshal.FreeHGlobal(structPtr); //返回结构体 return obj; } //结构体复制入byte数组 public static byte[] StructToBytes(object structObj) { //得到结构体的大小 int size = Marshal.SizeOf(structObj); //创建byte数组 byte[] bytes = new byte[size]; //分配结构体大小的内存空间 IntPtr structPtr = Marshal.AllocHGlobal(size); //将结构体拷到分配好的内存空间 Marshal.StructureToPtr(structObj, structPtr, false); //从内存空间拷到byte数组 Marshal.Copy(structPtr, bytes, 0, size); //释放内存空间 Marshal.FreeHGlobal(structPtr); //返回byte数组 return bytes; } } } |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。