2012-04-24 5 views
3

저는 모두 헤더 구조체로 시작하는 구조체가 여러 개 있습니다. 이C# (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; 
}; 

문제입니다 내가 바이트 []와 연합을 할 필요가 있다는 것입니다. 나는 이것으로 시도했다

[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#에서 유니온과 같은 작업을 수행하려면 어떻게해야합니까?

+0

"헤더에서 데이터를 가져올 수 없습니다"라는 것은 무엇을 의미합니까? 예외가 있습니까? 잘못된 데이터가 있습니까? 어떤 필드에서 헤더,'header' 또는'buffer' 필드에 접근하려고합니까? –

+0

버퍼에 넣습니다 : {0xe0 0x11 0x11 0x00 0x05 0x00} 하지만이 때 recBuffer.header.start는 0xe0 대신 0x00입니다. – 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