C#中结构体和字节数组转换实现
发布时间:2020-12-15 03:49:17 所属栏目:百科 来源:网络整理
导读:最近在使用结构体与字节数组转化来实现socket间数据传输。现在开始整理一下。对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using Syste
最近在使用结构体与字节数组转化来实现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; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |