2010-10-07 14 views
5

Ağ protokolü ile iletişim kurmak için bir arabirim yazmayı deniyorum, ancak IEEE belgesi, iletişim kuralı bit düzeyinde tek bir baytla bilgi bölmesiyle açıklar.C veri yapılarını ve yazım hatalarını eşleme. Net

Ne .NET için bir uyumluluk katmanı taşıma sırasında

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; 

gibi

typedef bir C işleme izlenmesi gereken en iyi yol olacaktır?

+0

Ben Aslında bir şey sizin * diğer * C programı içine dotnet değerlerini dönüştürmek için C bir ileti geçirme programı oluşturmak gerekebilir ... Eğer dotnet küçük veri türlerini alabilirsiniz sanmıyorum Görebilir ... – Frosty840

+2

@Frosty: '[FieldOffset]' – SLaks

+0

ve @SLaks bunu bir kez daha yapar. C# arkadaşımla nasıl gideceğini bilmediğin bir şey var mı? – jcolebrand

cevap

1

FieldOffsetAttribute, bir bayttan daha küçük değerleri temsil etmenin bir yolu olmamasına rağmen size yardımcı olabilir.

İki değeri birlikte çalışma amacıyla temsil etmek için bir bayt kullanır ve ardından özellik alıcıları aracılığıyla değere erişirim.

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