c# - 如何将结构从 C++ 迁移到 C#

标签 c# c++ struct migration

我正在编写一个接收复杂数据结构的 UDP 客户端。 我确实有 C++ 中的结构,但我的程序是 C# 中的

Bitfiel 和 union 有很多不同的结构。

有什么方法可以让我不必手动转换结构?

还有在 C# 中实现位域和 union 的简单方法吗?

现在我正在使用位域属性,但这是一项艰巨的工作,很可能会出错。

我提供了一个我现在正在做的简化示例,大约有 50 个结构,每个结构有 100 行代码。

示例 C++:

typedef struct Message_s
{
    unsigned char var : 2;
    unsigned char var2 : 6;

    union
    {
         struct
         {
            unsigned char sVar;
            unsigned char sVar2;
         }
         char arr[32];
     }    
}Message_t;

示例 C#:

 [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
struct Message_s
{
    private byte Field1
    public byte var
    {
       get
       {
           return (byte)(Field1 & 0x03);
       }
       set
       {
           Field1 = (byte)((Field1 & ~0x03) | value);
       }
    public byte var2
    {
       get
       {
           return (byte)(Field1 & 0xFC);
       }
       set
       {
           Field1 = (byte)((Field1 & 0x03) | value<<2);
       }
     }
//unions may be possible with properties...
}

最佳答案

简短的回答是否定的,似乎没有一种简单的方法可以将 C++ 结构转换为 C# 格式。但是,有一种在 C# 结构中执行 union 的方法;这是一个好主意,还是从头开始上课更好,将取决于您。

要在 C# 结构中获取 union ,您可以使用 LayoutKind.ExplicitFieldOffset 属性:

[StructLayout(LayoutKind.Explicit)]
struct StructTest
{
    // A byte at the beginning of the struct.
    [FieldOffset(0)]
    public byte byte1;

    // Another byte immediately after it.
    [FieldOffset(1)]
    public byte byte2;

    // Now an integer which covers both.
    [FieldOffset(0)]
    public Int16 int1;
}

您可以按预期方式使用它:

        var foo = new StructTest();
        foo.byte1 = 3;
        foo.byte2 = 6;
        Console.WriteLine("{0}", foo.int1);

        var bar = new StructTest();
        bar.int1 = 5050;
        Console.WriteLine("{0}, {1}", bar.byte1, bar.byte2);

产生 1539186, 19

这为您提供了 union 结构,但它仍然没有解决 BitFields 的主要问题。对此似乎没有达成共识(当然,除了您已经完成的工作;例如,参见 [ 1 ])。可以使用 MarshalAs 属性做一些巧妙的事情,将自定义 BitField 类映射到底层结构,但在这种努力下,继续编写自定义类可能会更容易。

关于c# - 如何将结构从 C++ 迁移到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11140373/

相关文章:

java - Opencv 将 Mat 从 Android 传递到 JNI 错误

swift - C 中的 offsetof(struct, member) 在 Swift 中的等价物是什么?

c - 如何获取结构体内部的结构体并将其分配给结构体数组

c# - 获取和设置 ClosedXML.Excel 的单元格值和 Id

c# - SSIS 读取 System.Object 变量并在脚本组件中写入它...如何?

c# - C#中的动态类创建

c# - BulkInsertCommand 在 Sync Framework 2.1 中失败

c++ - 如何在不使用++ 或 + 或其他算术运算符的情况下将两个数字相加

c++ - 太阳系模拟器物理集成问题(虚幻引擎 4,C++)

c - 获取有关 C 类型结构体成员的信息(类型、值...等)