您的位置:首页 > 编程语言 > C#

c#中关于结构体和字节数组转化

2013-11-15 19:53 225 查看
最近在使用结构体与字节数组转化来实现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;

}

}

}

(转自: http://www.cnblogs.com/sdnyzhl/archive/2013/04/26/3045000.html)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: