【问题标题】:Mapping C data structures and typedefs to .Net将 C 数据结构和 typedef 映射到 .Net
【发布时间】:2011-04-22 10:03:06
【问题描述】:

我正在尝试编写一个用于与网络协议通信的接口,但 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 时?

【问题讨论】:

  • 我认为您无法在 dotnet 中获得如此小的数据类型...您可能必须在 C 中创建一个消息传递程序才能将 dotnet 值实际转换为您的 其他的 C程序可以看到...
  • @Frosty: [FieldOffset]
  • 和@S​​Laks 再次这样做。我的朋友有什么你不知道如何在 C# 中争吵的吗?
  • @drachenstern:不幸的是,是的。 stackoverflow.com/questions/263276/…stackoverflow.com/questions/2134391/…(在 Vista 中)。
  • 大声笑,我知道我知道......但你总是那么准,而且速度很快。

标签: .net data-structures porting


【解决方案1】:

FieldOffsetAttribute 可能对您有所帮助,尽管没有办法表示小于一个字节的值。

出于互操作目的,我会使用一个字节来表示这两个值,然后通过属性 getter 访问该值。

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

【讨论】:

    猜你喜欢
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多