【问题标题】:Buffered and Marshaled Char Array Over Socket, Prints System.Char[]通过套接字缓冲和编组的字符数组,打印 System.Char[]
【发布时间】:2012-11-12 20:31:05
【问题描述】:

我正在使用 .NET 套接字制作客户端/服务器程序(它是我正在使用的系统的模型),以便于使用。一切顺利,数据全部发送;最大的问题是 char 数组。

我发送的数据包本质上是一个结构内的一堆双精度和一个字符数组(这是必要的/必不可少的,因为它在我正在模仿的系统上对数据包进行建模)。所有的双打都工作得很好,但是 char 数组有点棘手,因为数组需要 4 个字节/字符长。

我一直在使用编组库来处理字节数据以及 4 的 Char 数组缓冲区大小,如下所示:

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public char[] tmp;

我还使用:[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 来确保我的字符为 1 个字节。最终将读取我的客户端程序的服务器是 C 语言,我想确保类型对齐。

无论如何,我当前用来测试东西的服务器程序接收到数据包并且一切正常,但是当我尝试打印它以进行调试时,char 数组并没有完全按计划进行。

我有一个大字符串,我把所有的东西都放进去,像这样:

return_str += "\nChar Array (tmp) : " + str.tmp;

然后我用稍后的函数调用打印它。

打印的内容如下:

 System.Char[] .

而不是我指定的 char 数组(IE、ABCD 或类似的东西)。

我指定数据包值的方式是使用带有滑块和文本框等的 Windows 窗体应用程序。就像我说的,双打都完美地传达了它们的值,但这是另一个问题。

我不确定这是编组代码的问题,还是只是我缺少 char 数组的问题。

真的需要一些帮助

【问题讨论】:

    标签: c# arrays sockets char marshalling


    【解决方案1】:

    char[] 上调用ToString() 将准确打印出您所看到的内容。

    您需要使用new string(str.tmp)char[] 转换为字符串。

    如果您正在读取字符串,请考虑改用 byte[],然后使用 System.Encoding.Text 读取字符串(有 ASCII 编码器和各种 UTF 变体)。

    【讨论】:

    • 感谢您的回复,已解决!我有点坚持使用 char[] 因为它是我试图建模的系统中使用的类型。但我以后会记住这一点,谢谢你的提示。
    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2011-08-01
    • 2012-08-14
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多