c# - 在 C# 中使用 StructLayout 联合

标签 c# union structlayout

我有多个结构,它们都以 header 结构开头。像这样

public struct BaseProtocol {
    public Header header;
    public Footer footer;
};

标题是

public struct Header {
    public Byte start;
    public Byte group;
    public Byte dest;
    public Byte source;
    public Byte code;
    public Byte status;
};

现在的问题是我需要将它们与 Byte[] 合并。我用这个试过了

[StructLayout( LayoutKind.Explicit, Size=255 )]
public struct RecBuffer {

    [FieldOffset( 0 )]
    public Header header;

    [FieldOffset( 0 )]
    [MarshalAs( UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 255 )]
    public Byte[] buffer;
};

当我用数据填充缓冲区时,我无法从标题中获取数据。我怎样才能使 C# 的功能与我在 C++ 中使用联合功能的功能相同?

最佳答案

Byte[] 是一个引用类型字段,您不能用值类型字段覆盖它。您需要一个固定大小的缓冲区,并且需要使用 /unsafe 对其进行编译。像这样:

[StructLayout(LayoutKind.Explicit, Size = 255)]
public unsafe struct RecBuffer
{

    [FieldOffset(0)]
    public long header;

    [FieldOffset(0)]
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 255)]
    public fixed Byte buffer[255];
};

关于c# - 在 C# 中使用 StructLayout 联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10299978/

相关文章:

mysql - SQL UNION ALL 消除重复项

c# - 结构中指针字段的大小

C# OleDb 选择查询抛出缺少运算符异常

C# + WMI + LPT 求助!

mysql - 将 INNER-JOIN 与 UNION ALL 和 mysql 中的另一个表一起使用

php - Codeigniter 中的 MySql 联合错误

c# - C# 中的 `PROCESSENTRY32W`?

c# - 如何在 wp7 中通过扬声器播放广播

c# - 为什么在 ASP.NET Core Web API 中使用 SkiaSharp 会导致崩溃?