c++ tcpserver 可以接收无符号字符吗?

Posted

技术标签:

【中文标题】c++ tcpserver 可以接收无符号字符吗?【英文标题】:can c++ tcpserver receive unsigned char? 【发布时间】:2013-06-18 04:42:09 【问题描述】:

目前我有一个 c# tcpclient 和一个 c++ tcpserver,但我只能从服务器端的流中读取字符,因此所有数据都将转换为字符。由于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();

这是在客户端,我将在服务器端收到的内容打印为签名 int: 如果我发送一个 char 其 ascii 代码 = 136,它将变为 2 个字节:0,136。但在服务器端,它打印 0, -22。 那么有没有办法让 c++ 流读取 unsigned char? 还是有其他方法可以解决这个问题? 感谢您的帮助!

【问题讨论】:

您可以将接收到的字符重新转换为字节(无符号字符) 【参考方案1】:

您通过 TCP 连接获得的只是原始数据,您选择解释它的方式决定了它的外观。

最简单的解决方案可能是在打印/使用之前将其转换为:

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

【讨论】:

【参考方案2】:

您的代码已损坏。

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。

【讨论】:

以上是关于c++ tcpserver 可以接收无符号字符吗?的主要内容,如果未能解决你的问题,请参考以下文章

CORBA IDL 到 C++ - 字符与无符号字符?

从无符号字符到 std::string 的 C++ 转换 [重复]

C#编组来自C++ DLL的无符号字符返回值[重复]

如何将无符号字符数组解析为数值数据

无符号字符值循环 C++

C ++ wxsocket TCP服务器发送无符号字符数组但python客户端获得4个字节