2010-10-07 29 views
5

Tôi đang cố gắng viết một giao diện để giao tiếp với giao thức mạng, nhưng tài liệu IEEE mô tả giao thức ở mức bit với phân chia thông tin trên một byte đơn.Ánh xạ C cấu trúc dữ liệu và typedefs tới .Net

Điều gì sẽ là cách tốt nhất để đi về xử lý một C typedef như

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; 

khi porting một lớp tương thích với .NET?

+0

Tôi không nghĩ bạn có thể nhận các loại dữ liệu nhỏ trong dotnet ... Bạn có thể phải tạo chương trình truyền tin nhắn trong C để thực sự chuyển đổi giá trị dotnet thành chương trình * khác * C của bạn có thể thấy ... – Frosty840

+2

@Frosty: '[FieldOffset]' – SLaks

+0

và @SLaks lại làm điều đó một lần nữa. Có bất cứ điều gì bạn không biết làm thế nào để wrangle trong C# người bạn của tôi? – jcolebrand

Trả lời

1

FieldOffsetThuộc tính có thể giúp bạn, mặc dù không có cách nào để biểu thị các giá trị nhỏ hơn byte.

Tôi sẽ sử dụng một byte để biểu diễn hai giá trị cho mục đích interop và sau đó truy cập giá trị thông qua getters thuộc tính.

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); } } 
} 
Các vấn đề liên quan