C# pointer to unmanaged struct with array

拟墨画扇 提交于 2019-12-13 02:53:59

问题


I am trying to implement a C style struct in C# for interoperability.

Here is the struct I'm trying to convert:

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;

And here is my C# struct:

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct DivertIPv6Header
{
    /// TrafficClass0 : 4
    /// Version : 4
    /// FlowLabel0 : 4
    /// TrafficClass1 : 4
    public uint bitvector1;

    /// UINT16->unsigned short
    public ushort FlowLabel1;

    /// UINT16->unsigned short
    public ushort Length;

    /// UINT8->unsigned char
    public byte NextHdr;

    /// UINT8->unsigned char
    public byte HopLimit;

    /// UINT32[4]
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.U4)]
    public uint[] SrcAddr;

    /// UINT32[4]
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.U4)]
    public uint[] DstAddr;

    public uint TrafficClass0
    {
        get
        {
            return bitvector1 & 15u;
        }
        set
        {
            bitvector1 = value | bitvector1;
        }
    }

    public uint Version
    {
        get
        {
            return (bitvector1 & 240u) / 16;
        }
        set
        {
            bitvector1 = (value * 16) | bitvector1;
        }
    }

    public uint FlowLabel0
    {
        get
        {
            return (bitvector1 & 3840u) / 256;
        }
        set
        {
            bitvector1 = (value * 256) | bitvector1;
        }
    }

    public uint TrafficClass1
    {
        get
        {
            return (bitvector1 & 61440u) / 4096;
        }
        set
        {
            bitvector1 = (value * 4096) | bitvector1;
        }
    }
}

The only problem here is that I need to declare a pointer to this structure so that I can overlap with it's data.

If I try to declare a pointer I got this compile-time error:

cannot declare pointer to non-unmanaged type.

Any ideas?


回答1:


Use Marshal.PtrToStructure:

        var bytes = yourUnmanagedByteArray;

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

You could make it work without a fixed buffer too, if you don't want to use unsafe code.



来源:https://stackoverflow.com/questions/17501693/c-sharp-pointer-to-unmanaged-struct-with-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!