指向带有数组的非托管结构的C#指针

指向带有数组的非托管结构的C#指针,c#,pointers,data-structures,interop,unmanaged,C#,Pointers,Data Structures,Interop,Unmanaged,我试图在C#中实现一个C风格的结构,以实现互操作性 以下是我试图转换的结构: typedef struct { UINT8 TrafficClass0:4; UINT8 Version:4; UINT8 FlowLabel0:4; UINT8 TrafficClass1:4; UINT16 FlowLabel1; UINT16 Length; UINT8 NextHdr; UINT8 HopLimit; UINT

我试图在C#中实现一个C风格的结构,以实现互操作性

以下是我试图转换的结构:

typedef struct
{
    UINT8  TrafficClass0:4;
    UINT8  Version:4;
    UINT8  FlowLabel0:4;
    UINT8  TrafficClass1:4;
    UINT16 FlowLabel1;
    UINT16 Length;
    UINT8  NextHdr;
    UINT8  HopLimit;
    UINT32 SrcAddr[4];
    UINT32 DstAddr[4];
} DIVERT_IPV6HDR, *PDIVERT_IPV6HDR;
这是我的C结构:

这里唯一的问题是我需要声明一个指向这个结构的指针,这样我就可以与它的数据重叠

如果我试图声明指针,则会出现以下编译时错误:

cannot declare pointer to non-unmanaged type.

有什么想法吗?

使用
Marshal.PtrToStructure

        var bytes = yourUnmanagedByteArray;

        fixed (byte* b = bytes)
            return (T)Marshal.PtrToStructure(new IntPtr(b), typeof(DivertIPv6Header));

如果您不想使用
不安全的
代码,也可以在没有
固定的
缓冲区的情况下使其工作。

您不太可能需要指针,但您没有提供足够的信息。“重叠”表示您实际上想要声明一个并集,您可以使用[StructLayout(LayoutKind.Explicit)]属性来实现。但是这仍然是数组成员的一个问题,因为同样的原因,你不能声明指向这个结构的指针,你需要用fixed关键字将它们声明为固定大小的缓冲区。我对联合不感兴趣。我有一个指向byte*数组的指针,我想将它转换为DivertIPv6Header*。这就是Marshal.PtrToStructure(),在不使用fixed的情况下可以正常工作。你对你的要求含糊不清,这不是在帮助我们。你有一个指向字节指针数组的指针吗?
        var bytes = yourUnmanagedByteArray;

        fixed (byte* b = bytes)
            return (T)Marshal.PtrToStructure(new IntPtr(b), typeof(DivertIPv6Header));