将 c++ 字符数组转换为 c# 字符串

本文关键字:字符串 转换 数组 c++ 字符 | 更新日期: 2023-09-27 18:34:43

我在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 数组中的空终止符造成的。

例如,如果 I 从 C++ 个字符数组发送"Hello''0",则如下所示:

H e l l o

''0 ''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);

将 c++ 字符数组转换为 c# 字符串

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

Package pkg;
strcpy_s(pkg.str, 10, "Hello");
char* bytes = (char*)&pkg;
send(socket, bytes, sizeof(pkg), NULL);

strcpy_s函数将dst缓冲区的大小作为参数,以避免溢出(请参阅此处(。我在评论中询问了您创建它的方式,因为它甚至看起来都不是有效的C++。

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

我假设 C# 知道如何处理收到的字符串,因此如果您发送正确的字符串,则应正确接收该字符串。

您正在发送数组的大小而不是 strlen 的 strlen。

请注意,如果您使用 strlen 发送,则需要添加 1 以发送字符串的空终止

这是我通常在带有串行行的包装器 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);