c# - 在结构 C# 中使用半字节

标签 c# c++ struct

我们可以像 C++ 一样在 C# 结构中使用半字节吗? 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
     }

谢谢。

最佳答案

您可以使用 [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

关于c# - 在结构 C# 中使用半字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40754909/

相关文章:

c - 为什么下面代码的输出是-1和-2?

c++ - 类型定义问题

c# - Google Calendar API 身份验证 .NET 浏览器窗口

javascript - 如何复制 wwwroot 中的图片,或者如何引用它们?

c# - 使用 C# 截取任何外部应用程序的屏幕截图

c++ - 'wrap' 异常是个好主意吗?

c++ - 使用套接字在 C++ 中进行客户端到服务器身份验证

c# - ASP.NET C# - 从 Outlook Live SMTP 服务器发送电子邮件

c++ - 处理 .wav 文件期间输出失真

c - malloc/结构指针数组段错误