在struct C#中使用半字节

时间:2016-11-23 02:10:41

标签: c# c++ struct

我们可以像C ++一样使用C#struct中的半字节吗? C#中有没有等效的代码?

typedef struct PHeader {
    #if defined(LITTLE_ENDIAN)
        uint8_t         mHdrLen  :4;
        uint8_t         mVer     :4;
    #elif defined (BIG_ENDIAN)
        uint8_t         mVer    :4;         
        uint8_t         mHdrLen :4;        
    #endif
     }

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用[StructLayout(LayoutKind.Explicit)]FieldOffset属性获得相同的结果。您可以详细了解herehere

但请注意FieldOffset以字节为单位,而不是位。

[StructLayout(LayoutKind.Explicit)]
struct X
{
#if A
    [FieldOffset(0)] public byte a;
    [FieldOffset(1)] public byte b;
#else
    [FieldOffset(0)] public byte b;
    [FieldOffset(1)] public byte a;
#endif
}

示例:

unsafe
{
    short x = 12300;
    X* y = (X*)&x;
    X t = *y;

    Console.WriteLine(t.a + " - " + t.b);
}

如果您使用未定义的A运行该代码,您将获得结果48 - 12,但如果您#define A,则您将获得结果12 - 48