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