我在 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);
最佳答案
我不懂任何 C#,但也许你可以通过这种方式解决问题
Package pkg;
strcpy_s(pkg.str, 10, "Hello");
char* bytes = (char*)&pkg;
send(socket, bytes, sizeof(pkg), NULL);
strcpy_s
函数将 dst
缓冲区的大小作为参数以避免溢出(参见 here )。我在评论中询问了您的创新方式,因为它看起来甚至不像是有效的 C++。
终止空字节自动添加到 pkg.str
并且 "Hello"
在 o
字符之后有一个终止空字节,而且您不必手动添加它。
我假设 C# 知道如何处理接收到的字符串,所以如果您发送正确的字符串,它应该被正确接收。
关于c# - 将 C++ 字符数组转换为 C# 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27578646/