返回> 网站首页
WindowMobile字节对齐接收方法
yoours2014-02-28 15:45:01
简介一边听听音乐,一边写写文章。
一、字节对齐
Windows Mobile结构体默认为1字节对齐。
二、结构体字节对齐使用方法
1. 普通结构体
[StructLayout(LayoutKind.Explicit, Size = 8)]
public struct struParam{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] Param1;
[FieldOffset(6)]
public UInt16 Param2;
};
2. 结构体嵌套函数
[StructLayout(LayoutKind.Explicit, Size = 29)]
public struct struParam
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 29)]
private byte[] byData;
public byte[] Param1()
{
return byData;
}
public byte Param2()
{
return byData[6];
}
public byte Param3()
{
return byData[7];
}
public byte Length()
{
return byData[8];
}
public byte[] Data()
{
byte[] buff = new byte[Length()];
Array.Copy(byData, 9, buff, 0, Length());
return buff;
}
};
3. 结构体嵌套结构体
public struct struRecv
{
public byte InfoType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 29)]
private byte[] byData;
public void Init() {
byData = new byte[29];
}
public struParam1 FunstruParam1()
{
return (struParam1)FUNCE.BytesToStuct(byData, typeof(struParam1));
}
public struParam2 FunstruParam2()
{
return (struParam2)FUNCE.BytesToStuct(byData, typeof(struParam2));
}
public struParam3 FunstruParam3()
{
return (struParam3)FUNCE.BytesToStuct(byData, typeof(struParam3));
}
};
public static object BytesToStuct(byte[] bytes, Type type)
{
//得到结构体的大小
int size = Marshal.SizeOf(type);
//byte数组长度小于结构体的大小
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;
}
文章评论
1674人参与,0条评论