首页 > 编程 > C# > 正文

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

2020-01-24 01:47:02
字体:
来源:转载
供稿:网友

最近在使用结构体与字节数组转化来实现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, 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, 0, 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, 0, structPtr, size);      //将内存空间转换为目标结构体      object obj = Marshal.PtrToStructure(structPtr, type);      //释放内存空间      Marshal.FreeHGlobal(structPtr);      return obj;    }  }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表