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; } } }
上一篇: Unity绘制二维动态曲线