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