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)
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)
相关文章推荐
- c#中关于结构体和字节数组转化
- c#中关于结构体和字节数组转化
- c#中关于结构体和字节数组转化
- C# 转换uint,byte[],char[],string, short[]<->byte[] 结构体和字节数组转化
- [C#]结构体和字节数组的相互转化
- [C#]结构体和字节数组的相互转化
- C#中结构体和byte数组的转化
- C#中字符数组,字节数组和string之间的转化(转)
- C#结构体和字节数组的转换
- CsvHelper---C#关于CSV文件的导入和导出以及转化
- C#中字符数组,字节数组和string之间的转化
- C#结构体和字节数组的转换
- 关于C#中货币类型和数值类型、字符串类型的转化和在DataGridView中的显示问题:
- 关于C#结构体和byte[]之间的转换
- C#结构体和字节数组的转换
- C#中字符数组,字节数组和string之间的转化
- C# 结构体定义 转换字节数组 z
- C#结构体和字节数组的转换
- C# 笔记(三)--关于结构体变量
- C#结构体和字节数组的转换