我通过TCP连接发送一个字节,当我发送一个负数时(如本例中的-30
)我得到三个字节:
客户端:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
out.write((byte)-30);
out.flush();
out.close();
服务器端:
is = new DataInputStream(clientSocket.getInputStream());
is.readFully(bbb);
for (int i=0;i<bbb.length;i++)
System.out.println(i+":"+bbb[i]);
我得到的是:
0:-17
1:-65
2:-94
但我只发送了-30
答案 0 :(得分:4)
您正在使用作家,而您正在调用Writer.write(int)
:
写一个字符。要写入的字符包含在给定整数值的16个低位中; 16位高位被忽略。
因此您转换为int
,然后获取int
的最后16位。所以你实际上是在你的平台默认编码(看起来是UTF-8)中编写Unicode字符65506(U+FFE2)。这不是你想要写的东西,但那就是你 写的东西。
如果您只想编写二进制数据,则根本不应使用Writer
。只需使用OutputStream
- 如果需要,请将其打包在DataOutputStream
中,但不使用Writer
。 Writer
类用于文本。