将 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#,但也许你可以通过这种方式解决问题
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);