#region" 结构体struct与字节数组 byte[] 的转换 " /// 结构体转byte数组
/// </summary>
/// <param name="structObj">要转换的结构体</param>
/// <returns>转换后的byte数组</returns>
public static byte[] StructToBytes(object structObj)
{
byte[] bytes;
try
{
//得到结构体的大小
int size = Marshal.SizeOf(structObj);
//创建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);
//返回byte数组
return bytes;
}
catch (Exception ex)
{
mbox.msgbox(ex.Message);
//LogWriter.AddSystemException(ex);
return bytes = null;
}
} /// byte数组转结构体
/// </summary>
/// <param name="bytes">byte数组</param>
/// <param name="type">结构体类型</param>
/// <returns>转换后的结构体</returns>
public static object BytesToStuct(byte[] bytes, Type type)
{
object obj;
//try
//{
//得到结构体的大小
//mbox.msgbox(type.FullName);
int size = Marshal.SizeOf(type);
//byte数组长度小于结构体的大小
if (size > bytes.Length)
{
//返回空
return null;
}
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将byte数组拷到分配好的内存空间
Marshal.Copy(bytes, 0, structPtr, size);
//将内存空间转换为目标结构体
obj = Marshal.PtrToStructure(structPtr, type);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回结构体
return obj;
//}
//catch (Exception ex)
//{
// mbox.msgbox(ex.Message);
// LogWriter.AddSystemException(ex);
// return obj = null;
//}
} /// <summary>
/// 在SERVER LAN发的所有消息,DMT收到消息后,都要返回的确认消息表示已经收到
/// C++ 代码 /// //unsigned char direct;0x01
/// //unsigned char category; 0x04
/// //unsigned char type;
/// //unsigned char GroupID;
/// //unsigned char DeviceID;
/// //unsigned char DeviceMAC[16];// 自己的MAC Addr
/// //unsigned short PackNo; //2008-02-19 添加,为了给发送的udp广播包统一添加包的序号(给发送的包编号,等待返回确认)
/// //unsigned byte ConfirmCMD;//把所有命令进行编号,从0x01开始, SetPort ,QueryStatus,GetDisplayInfo,GetDiskSpaceInfo在刷新时不考虑???
/// //unsigned byte Recv;// 收到命令后的执行状态0: 收到但还没执行或是不需要执行的命令消息 ||| 1: 执行成功 ||| 2:执行不成功
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct ConfirmMSG
{
public byte direct;
public byte category;
public byte type;
public byte GroupID;
public byte DeviceID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] MAC;
public ushort PackNo;
public byte ConfirmCMD;
public ushort Recv;
}
给你参考
/// </summary>
/// <param name="structObj">要转换的结构体</param>
/// <returns>转换后的byte数组</returns>
public static byte[] StructToBytes(object structObj)
{
byte[] bytes;
try
{
//得到结构体的大小
int size = Marshal.SizeOf(structObj);
//创建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);
//返回byte数组
return bytes;
}
catch (Exception ex)
{
mbox.msgbox(ex.Message);
//LogWriter.AddSystemException(ex);
return bytes = null;
}
} /// byte数组转结构体
/// </summary>
/// <param name="bytes">byte数组</param>
/// <param name="type">结构体类型</param>
/// <returns>转换后的结构体</returns>
public static object BytesToStuct(byte[] bytes, Type type)
{
object obj;
//try
//{
//得到结构体的大小
//mbox.msgbox(type.FullName);
int size = Marshal.SizeOf(type);
//byte数组长度小于结构体的大小
if (size > bytes.Length)
{
//返回空
return null;
}
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将byte数组拷到分配好的内存空间
Marshal.Copy(bytes, 0, structPtr, size);
//将内存空间转换为目标结构体
obj = Marshal.PtrToStructure(structPtr, type);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回结构体
return obj;
//}
//catch (Exception ex)
//{
// mbox.msgbox(ex.Message);
// LogWriter.AddSystemException(ex);
// return obj = null;
//}
} /// <summary>
/// 在SERVER LAN发的所有消息,DMT收到消息后,都要返回的确认消息表示已经收到
/// C++ 代码 /// //unsigned char direct;0x01
/// //unsigned char category; 0x04
/// //unsigned char type;
/// //unsigned char GroupID;
/// //unsigned char DeviceID;
/// //unsigned char DeviceMAC[16];// 自己的MAC Addr
/// //unsigned short PackNo; //2008-02-19 添加,为了给发送的udp广播包统一添加包的序号(给发送的包编号,等待返回确认)
/// //unsigned byte ConfirmCMD;//把所有命令进行编号,从0x01开始, SetPort ,QueryStatus,GetDisplayInfo,GetDiskSpaceInfo在刷新时不考虑???
/// //unsigned byte Recv;// 收到命令后的执行状态0: 收到但还没执行或是不需要执行的命令消息 ||| 1: 执行成功 ||| 2:执行不成功
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct ConfirmMSG
{
public byte direct;
public byte category;
public byte type;
public byte GroupID;
public byte DeviceID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] MAC;
public ushort PackNo;
public byte ConfirmCMD;
public ushort Recv;
}
给你参考
TTempCard = record
Enabled: Boolean; //Enabled Flag
reserved: byte; //reserved
CardNumber : TCardNumber; //Card No.
reserved1: Word; //reserved
pNext: PTempCard; //pointer to the next temp card.
end;
pNext: PTempCard; //pointer to the next temp card.
关键是这一句怎么弄
class TTempCard
bool Enabled;
byte reserved;
TCardNumber CardNumber;
ushort reserved1;
TTempCard pNext;
}
用 class不行也 要用STRUCT
[StructLayout(LayoutKind.Sequential)]
struct TTempCard
{
bool Enabled;
byte reserved;
TCardNumber CardNumber;
ushort reserved1;
IntPtr pNext;
}