【问题标题】:Convert c++ char array to c# string将 c++ char 数组转换为 c# 字符串
【发布时间】:2014-12-20 09:00:32
【问题描述】:

我有一个 C++ 结构,它有一个 char[10] 字段。

struct Package
{
    char str[10];
};

我将结构转换为 char 数组并通过 TCP 套接字将其发送到 c# 应用程序,然后我将其转换回 c# 结构。

[StructLayout(LayoutKind.Sequential)]
public struct Package
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
    public string str;
};

转换正确完成,我收到了消息,但问题是消息的长度小于数组的大小,我认为这是由于 c++ char 数组中的空终止符造成的。

例如,如果我从 C++ 发送“Hello\0”,则 char 数组类似于:

H e l l o \0 \0 \0 \0 \0

当我在 c# 应用程序中得到它时,它是这样的:

H e l l o Ì Ì Ì Ì Ì

而且我真的不知道如何处理这个(个人喜欢称呼)垃圾字符'Ì'。

请帮助我。任何帮助表示赞赏。

更新:

我只是将结构转换为 char* 并通过套接字发送;

Package pkg;
strcpy_s(pkg.str, 'Hello\0');

char* bytes = (char*)&pkg;

send(socket, bytes, sizeof(pkg), NULL);

【问题讨论】:

  • 您的数组大小为 10。请尝试输入 10 个字符。你没有这个字符'Ì'。所以你可以拆分字符串。这是一种解决方案。
  • 您的解决方案适用于 10 个字符,但如果我需要越来越多的字符怎么办。但是,您的回答让我想起,当我从 c++ 发送 char 数组时,我可以有一个字符串字符的结尾。我仍在等待更多帮助。
  • 在 c# 代码中您似乎没有收到 '\0' 字符。或者永远不会在 C++ 中发送给您,但在 C++ 中,默认情况下所有字符的数组“memsetted”设置为 0x00
  • 实际上,即使我在 C++ 中将 '\0' 放在 char 数组的末尾,它也不会在 c# 中收到。
  • 我想我们需要更多代码。粘贴用于从 C++ 数组传递到 C# 字符串的方式

标签: c# c++ c arrays string


【解决方案1】:

我不懂任何 C#,但也许你可以通过这种方式解决问题

Package pkg;
strcpy_s(pkg.str, 10, "Hello");

char* bytes = (char*)&pkg;

send(socket, bytes, sizeof(pkg), NULL);

strcpy_s 函数将dst 缓冲区的大小作为参数来避免溢出(请参阅here)。我在 cmets 中询问了您对其进行改造的方式,因为它甚至看起来都不像是有效的 C++。

终止空字节会自动添加到pkg.str,并且"Hello" 在o 字符之后有一个终止空字节,您不必手动添加。

我假设 C# 知道如何处理接收到的字符串,所以如果你发送正确的字符串,它应该被正确接收。

【讨论】:

  • 效果惊人。我不知道你为什么收到反对票。无论如何解释是什么?
  • 顺便说一句:sizeof(pkg) 完全可以,只要pkg.str 是一个数组而不是一个指针,如果它是一个指针,那么它将是sizeof(pkg) + strlen(pkg.str) + 1,+ 1 用于终止空字节。你必须使用malloc为字符串分配空间。
【解决方案2】:

这是我通常在我的包装 dll 中使用串行线做的事情

        public byte[] RXArray = new byte[length];

        byte[] appo = new byte[MsgLength];
        Array.ConstrainedCopy(RXArray, NcharsToCopy, appo, 0, MsgLength);
        string ConvertedToString = System.Text.Encoding.UTF8.GetString(appo);

【讨论】:

    【解决方案3】:

    您发送的是 sizeof 数组而不是 strlen 的 str。

    注意,如果你用strlen发送,你需要加1来发送字符串的空终止

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-13
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2018-03-27
      • 2013-05-13
      相关资源
      最近更新 更多