使用tcp发送负字节

时间:2014-06-09 05:48:52

标签: java tcp

我通过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

1 个答案:

答案 0 :(得分:4)

您正在使用作家,而您正在调用Writer.write(int)

  

写一个字符。要写入的字符包含在给定整数值的16个低位中; 16位高位被忽略。

因此您转换为int,然后获取int的最后16位。所以你实际上是在你的平台默认编码(看起来是UTF-8)中编写Unicode字符65506(U+FFE2)。这不是你想要写的东西,但那就是你 写的东西。

如果您只想编写二进制数据,则根本不应使用Writer。只需使用OutputStream - 如果需要,请将其打包在DataOutputStream中,但使用WriterWriter类用于文本。