C#中StructLayout的联合体

3

我有多个结构体都以一个头结构体开头。就像这样

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++中union相同的功能?


“我无法从头文件中获取数据”是什么意思?您是否遇到了异常?您是否获得了不正确的数据?您尝试访问哪个字段的标题,header还是buffer字段? - Allon Guralnek
我将以下内容放入缓冲区:{ 0xe0 0x11 0x11 0x00 0x05 0x00 } 但是当我执行recBuffer.header.start时,它的值为0x00而不是0xe0。 - Calypoter
1个回答

8

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];
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接