c ++ tcpserver可以接收unsigned char吗?

时间:2013-06-18 04:42:09

标签: c++ tcp

目前我有一个c#tcpclient和一个c ++ tcpserver,但是我只能从服务器端的流中读取字符,因此所有数据都将被转换为char。由于c ++ char是带符号的8位整数,但c#客户端发送的是无符号8位整数的字节,因此无法在服务器端正确接收从客户端发送的所有数据> = 128。 例如:

        char[] textChars = text.ToCharArray();
        byte[] textBytes = new byte[textChars.Length *2];
        byte low;
        byte high;
        UInt16 current;
        for (int i = 0; i < textChars.Length; i++)
        {
            current = (UInt16)textChars[i];
            high = (byte)(current / 256);
            low = (byte)(current % 256);
            textBytes[i * 2] = high;
            textBytes[i * 2 + 1] = low;
        }

        currentStream.Write(textBytes, 0, textBytes.Length);
        currentStream.Flush();

这是在客户端,我将在服务器端收到的内容打印为signed int: 如果我发送一个带有ascii代码= 136的字符,它将变成2个字节:0,136。但在服务器端,它打印0,-22。 那么有没有办法让c ++流读取unsigned char? 还是有另一种解决方法吗? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

你所获得的所有TCP连接都是原始数据,这就是你选择解释它决定它的样子的方式。

最简单的解决方案是在打印/使用之前将其投射:

signed char val = -22;               // emulate receipt of signed char.
printf ("%d\n", (unsigned char)val); // cast to change interpretation.

答案 1 :(得分:0)

您的代码已损坏。

char[] textChars = text.ToCharArray();
....
for (int i = 0; i < textChars.Length; i++)
{
    current = (UInt16)textChars[i];

“textChars”的元素是“char”类型。这意味着它们包含0-255之间的值。在下一行,您可以:

    high = (byte)(current / 256);

这只能评估为0。