C#中结构体和字节数组转换实现
最近在使用结构体与字节数组转化来实现socket间数据传输。现在开始整理一下。对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.IO; usingSystem.Runtime.InteropServices; namespaceFileSendClient { [StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)] structStructDemo { publicbytea; publicbytec; [MarshalAs(UnmanagedType.ByValArray,SizeConst=3)] publicbyte[]b; publicbyted; publicinte; } unsafeclassProgram { staticvoidMain(string[]args) { StructDemosd; sd.a=0; sd.d=0; sd.c=0; sd.b=newbyte[3]{0,0,1}; sd.e=5; intsize=0; //此处使用非安全代码来获取到StructDemo的值 unsafe { size=Marshal.SizeOf(sd); } byte[]b=StructToBytes(sd,size); ByteToStruct(b,typeof(StructDemo)); } //将Byte转换为结构体类型 publicstaticbyte[]StructToBytes(objectstructObj,intsize) { StructDemosd; intnum=2; byte[]bytes=newbyte[size]; IntPtrstructPtr=Marshal.AllocHGlobal(size); //将结构体拷到分配好的内存空间 Marshal.StructureToPtr(structObj,structPtr,false); //从内存空间拷贝到byte数组 Marshal.Copy(structPtr,bytes,0,size); //释放内存空间 Marshal.FreeHGlobal(structPtr); returnbytes; } //将Byte转换为结构体类型 publicstaticobjectByteToStruct(byte[]bytes,Typetype) { intsize=Marshal.SizeOf(type); if(size>bytes.Length) { returnnull; } //分配结构体内存空间 IntPtrstructPtr=Marshal.AllocHGlobal(size); //将byte数组拷贝到分配好的内存空间 Marshal.Copy(bytes,0,structPtr,size); //将内存空间转换为目标结构体 objectobj=Marshal.PtrToStructure(structPtr,type); //释放内存空间 Marshal.FreeHGlobal(structPtr); returnobj; } } }