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数组对应的搞在这个结构体里面就可以了,折腾半天不会

解决方案 »

  1.   

    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 64)]
    char[] pcSName;
      

  2.   

    printf("%d",sizeof(tBOOTPPacket));输出300而pPacket = (tBOOTPPacket *)pcPacketData;
    这句貌似也不过是给结构指针分配内存而已,给700内存啥意思,不懂……
      

  3.   


    那问题就是你的数组也没有初始化,这么初始化的结构指针指向的内存区域数据也是未知的,说白了放在c#里面就是new一个结构体么
      

  4.   

    pcPacketData数组肯定后来会收到数据,而且也正好是300。c语言用指针直接把数据映射为结构体形式了,我在c#里面也想把pcPacketData中的300个数据传给类似的一个结构体里面
      

  5.   

    那你把结构体定义好直接new就可以了
      

  6.   

           public struct tBOOTPPacket
            {
               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完了,关键是接下来该怎么转?
      

  7.   

    [StructLayoutAttribute(LayoutKind.Sequential)]
    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);
      

  8.   

    就这样的
    byte[] bytes = new byte[300];这就是你接收的数据