2012-04-24 5 views
3

У меня есть несколько структур, которые начинаются с структуры заголовка. Как этоUnion in C# with StructLayout

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++?

+0

Что вы подразумеваете под «Я не могу получить данные из заголовка»? Вы получаете исключение? Вы получаете неверные данные? Из какого поля вы пытаетесь получить доступ к заголовку, поле 'header' или' buffer'? –

+0

Я положил это в буфер: {0xe0 0x11 0x11 0x00 0x05 0x00} Но когда я это сделал, recBuffer.header.start был 0x00 вместо 0xe0. – Calypoter

ответ

7

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

Спасибо, сейчас работает. – Calypoter