2010-10-07 10 views
5

Próbuję napisać interfejs do komunikacji z protokołem sieciowym, ale dokument IEEE opisuje protokół na poziomie bitowym z podziałem informacji na jeden bajt.Mapowanie struktur danych C i typedefs do .Net

Co będzie najlepszym sposobem, aby przejść o dotknięciem C typedef takich jak

typedef struct { 
    Nibble transportSpecific; 
    Enumeration4 messageType; 
    UInteger4 versionPTP; 
    UInteger16 messageLength; 
    UInteger8 domainNumber; 
    Octet flagField[2]; 
    Integer64 correctionfield; 
    PortIdentity sourcePortIdentity; 
    UInteger16 sequenceId; 
    UInteger8 controlField; 
    Integer8 logMessageInterval; 
} MsgHeader; 

przy przenoszeniu warstwy zgodności dla .NET?

+0

Nie sądzę, można uzyskać typów danych, które w małych dotnet ... Być może trzeba stworzyć program wiadomość, przekazując C rzeczywiście przekształcić wartości DotNet dół do czegoś innego programu Twoja * C * można zobaczyć ... – Frosty840

+2

@Frosty: '[FieldOffset]' – SLaks

+0

i @SLaks robi to jeszcze raz. Czy jest coś, czego nie wiesz, jak się kłócić w C# z moim przyjacielem? – jcolebrand

Odpowiedz

1

FieldOffsetAttribute może być pomocne dla ciebie, chociaż nie ma sposobu na przedstawienie wartości mniejszych od bajtu.

Chciałbym użyć bajtu do reprezentowania dwóch wartości dla celów współdziałania, a następnie uzyskać dostęp do wartości poprzez gettery właściwości.

unsafe struct MsgHeader 
{ 
    public Nibble transportSpecific; 
    //Enumeration4 messageType; 
    //UInteger4 versionPTP; 
    // use byte as place holder for these two fields 
    public byte union; 
    public ushort messageLength; 
    public byte domainNumber; 
    public fixed byte flagField[2]; 
    public long correctionfield; 
    public PortIdentity sourcePortIdentity; 
    public ushort sequenceId; 
    public byte controlField; 
    public sbyte logMessageInterval; 

    // access value of two fields via getters 
    public byte messageType { get { return (byte)(union >> 4); } } 
    public byte versionPTP { get { return (byte)(union & 0xF); } } 
}