我正在尝试在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#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;
}
}
}
这里唯一的问题是我需要声明一个指向这个结构的指针,以便我可以与它的数据重叠。
如果我尝试声明一个指针,我得到了这个编译时错误:
cannot declare pointer to non-unmanaged type.
有什么想法吗?
答案 0 :(得分:0)
使用Marshal.PtrToStructure
:
var bytes = yourUnmanagedByteArray;
fixed (byte* b = bytes)
return (T)Marshal.PtrToStructure(new IntPtr(b), typeof(DivertIPv6Header));
如果您不想使用fixed
代码,也可以在没有unsafe
缓冲区的情况下使其正常工作。