Отображение структур данных C и typedefs в .Net - PullRequest
5 голосов
/ 07 октября 2010

Я пытаюсь написать интерфейс для связи с сетевым протоколом, но в документе IEEE описывается протокол на уровне битов с разбивкой информации по одному байту.

Каков наилучший способобрабатывать определение типа C, например

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;

, при переносе уровня совместимости на .Net?

1 Ответ

1 голос
/ 04 июня 2011

FieldOffsetAttribute может быть вам полезен, хотя нет способа представить значения меньше байта.

Я бы использовал байт для представления двух значений в целях взаимодействия, а затем получал бы доступ к значению через методы получения свойств.

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