gpt4 book ai didi

c# - 将 C++ 结构转换为 C# 结构

转载 作者:行者123 更新时间:2023-11-30 01:15:59 25 4
gpt4 key购买 nike

我需要将结构转换为字节,以便我可以通过网络发送或接收它。

假设结构如下所示:

struct Info
{
unsigned int Age;
char Name[];
};

我在 C# sharp 中有等效的结构,它是:

[StructLayout(LayoutKind.Sequential)]
public struct Info
{
public uint Age;
public string Name;
};

要将 C# 结构转换为字节,我使用此方法:

    public Byte[] GetBytes(Info info)
{
int size = Marshal.SizeOf(info);
byte[] arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);

Marshal.StructureToPtr(info, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr);

return arr;
}

为了将接收到的字节转换为 C++ 结构,我使用了这个方法:

Info GetInfo(const char* bytes)
{
Info info;
memcpy(&info, bytes, sizeof(info));

return info;
}

我的问题是结构的 Age 字段转换得很好,但 Name 字段从来没有发送过。

更新

我可以使用下面的代码轻松地将字符串转换为字节,并将其从 C# 客户端应用程序发送到 C++ 服务器应用程序。

        byte[] buffer = Encoding.UTF8.GetBytes(text + "\0");

所以我决定如下更改 C# 结构:

[StructLayout(LayoutKind.Sequential)]
public struct Info
{
public uint Age;
public byte[] Name;
};

但在这种情况下,GetBytes() 方法会崩溃。

最佳答案

  1. 您的 C++ 结构使用灵活的数组成员作为最后一个元素,这是从 C99 借来的扩展:

    本质上就是一个未知长度的数组结束它。
    由于长度未知,当询问结构大小时,编译器将假定为 0
    我有点怀疑那不是你想要的。

  2. 您的 C# 结构有一个 string 成员,它不是值类型。

    像您一样将托管指针复制到它是非常荒谬的。

那么,你应该怎么做呢?

定义您自己的线格式。

  • 无符号 32 位整数将很容易编码。
  • 字符串比较难。你有一个从不属于字符串的标记值吗?
    或者您是否必须使用/更喜欢计数的字符串,在这种情况下您必须决定大小的类型并首先编码?

    此外,不要忘记字符集:首选 UTF-8,但如果它仅适用于 Windows,UTF-16 little-endian 也可能是一个可行的选择。

关于c# - 将 C++ 结构转换为 C# 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27534653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com