C# · 12月 28, 2021

C#中结构体和字节数组转换实现

最近在使用结构体与字节数组转化来实现socket间数据传输。现在开始整理一下。对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Runtime.InteropServices;namespace FileSendClient{ [StructLayoutAttribute(LayoutKind.Sequential,CharSet = CharSet.Ansi,Pack = 1)] struct StructDemo { public byte a; public byte c; [MarshalAs(UnmanagedType.ByValArray,SizeConst = 3)] public byte[] b; public byte d; public int e; } unsafe class Program { static void Main(string[] args) { StructDemo sd; sd.a = 0; sd.d = 0; sd.c = 0; sd.b = new byte[3] { 0,1 }; sd.e = 5; int size = 0; //此处使用非安全代码来获取到StructDemo的值 unsafe { size = Marshal.SizeOf(sd); } byte[] b = StructToBytes(sd,size); ByteToStruct(b,typeof(StructDemo)); } //将Byte转换为结构体类型 public static byte[] StructToBytes(object structObj,int size) { StructDemo sd; int num = 2; byte[] bytes = new byte[size]; IntPtr structPtr = Marshal.AllocHGlobal(size); //将结构体拷到分配好的内存空间 Marshal.StructureToPtr(structObj,structPtr,false); //从内存空间拷贝到byte 数组 Marshal.Copy(structPtr,bytes,size); //释放内存空间 Marshal.FreeHGlobal(structPtr); return bytes; } //将Byte转换为结构体类型 public static object ByteToStruct(byte[] bytes,Type type) { int size = Marshal.SizeOf(type); if (size > bytes.Length) { return null; } //分配结构体内存空间 IntPtr structPtr = Marshal.AllocHGlobal(size); //将byte数组拷贝到分配好的内存空间 Marshal.Copy(bytes,size); //将内存空间转换为目标结构体 object obj = Marshal.PtrToStructure(structPtr,type); //释放内存空间 Marshal.FreeHGlobal(structPtr); return obj; } }}