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 可以接收无符号字符吗?的主要内容,如果未能解决你的问题,请参考以下文章