目前我有一个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? 还是有另一种解决方法吗? 谢谢你的帮助!
答案 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。