문제

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?

도움이 되었습니까?

해결책

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top