欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-21 09:42:59
最近在使用结构体与字节数组转化来实现socket间数据传输。现在开始整理一下。对于marshal可以查阅msdn,关于字节数组与结构体转代码如下: using s...

最近在使用结构体与字节数组转化来实现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;
    }
  }
}