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

标签 c# c++ c arrays string

我在 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/

相关文章:

c# - 直接指定Action与Task-Generator与TPL数据流ActionBlock有什么区别?

C++ 入门第 5 版 : operator new and operator delete overloading

c# - 将 boost::archive 写入 C# 流

c++ - 数组上的 const 值是否与数组上的 const 不同

c# - Asp.net mvc Url.Action 使用可为空参数重定向 Controller

c# - 将数据绑定(bind)到gridview

c# - 访问自定义属性的值

c++ - 如何修复/正确初始化/清理矩阵类泄漏内存

c - 访问负索引处的数组元素

c - 加权相关性