Union in c# with StructLayout

人走茶凉 提交于 2019-12-23 19:45:50

问题


I have multiple structs that all starts with a header struct. Like this

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

The header is

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

The problem now is that I need to union them with a Byte[]. I tried it with this

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

When I fill the buffer with data I can't get the data from the header. How can I make c# do the same as I can do with union in c++?


回答1:


Byte[] is a reference type field, which you cannot overlay with a value type field. You need a fixed size buffer and you need to compile it with /unsafe. Like this:

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


来源:https://stackoverflow.com/questions/10299978/union-in-c-sharp-with-structlayout

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!