typedef struct
{
unsigned char ucOp;
unsigned char ucHType;
unsigned char ucHLen;
unsigned char ucHops;
unsigned long ulXID;
unsigned short usSecs;
unsigned short usFlags;
unsigned long ulCIAddr;
unsigned long ulYIAddr;
unsigned long ulSIAddr;
unsigned long ulGIAddr;
unsigned char pucCHAddr[16];
char pcSName[64];
char pcFile[128];
unsigned char pucVend[64];
}
tBOOTPPacket;
tBOOTPPacket *pPacket;
unsigned char pcPacketData[700];
pPacket = (tBOOTPPacket *)pcPacketData;上面这个转换该怎么实现?只要把byte数组对应的搞在这个结构体里面就可以了,折腾半天不会
char[] pcSName;
这句貌似也不过是给结构指针分配内存而已,给700内存啥意思,不懂……
那问题就是你的数组也没有初始化,这么初始化的结构指针指向的内存区域数据也是未知的,说白了放在c#里面就是new一个结构体么
{
public byte ucOp;
public byte ucHTpe;
public byte ucHLen;
public byte ucHops;
public ulong ulXID;
public ushort usSecs;
public ushort usFlags;
public ulong ulCIAddr;
public ulong ulYIAddr;
public ulong ulSIAddr;
public ulong ulGIAddr;
public byte[] pucCHAddr;
public char[] pcSName;
public char[] pcFile;
public byte[] pucVend;
}
tBOOTPPacket BOOTPacket = new tBOOTPPacket();
BOOTPacket.pucCHAddr = new byte[16];
BOOTPacket.pcSName = new char[64];
BOOTPacket.pcFile = new char[128];
BOOTPacket.pucVend = new byte[64];
已经new完了,关键是接下来该怎么转?
public struct tBOOTPPacket
{
byte ucOp;
byte ucHType;
byte ucHLen;
byte ucHops;
uint ulXID;
ushort usSecs;
ushort usFlags;
uint ulCIAddr;
uint ulYIAddr;
uint ulSIAddr;
uint ulGIAddr;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16)]
byte[] pucCHAdd;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 64)]
byte[] pcSName;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 128)]
byte[] pcFile;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 64)]
byte[] pucVend;
}//字节数组转结构byte[] bytes = new byte[300];Type type = typeof(tBOOTPPacket);
int size = Marshal.SizeOf(type);
IntPtr p = Marshal.AllocHGlobal(size);
Marshal.Copy(bytes, 0, p, size);
tBOOTPPacket obj = (tBOOTPPacket)Marshal.PtrToStructure(p, type);
Marshal.FreeHGlobal(p);
byte[] bytes = new byte[300];这就是你接收的数据