插座上的缓冲和Marshaled字符数组,打印System.Char []

时间:2012-11-12 20:31:05

标签: c# arrays sockets char marshalling

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

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

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

[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数组的问题。

真的可以使用一些帮助

1 个答案:

答案 0 :(得分:3)

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

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

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