我正在使用Java套接字程序将服务器中的整数和字符写回客户端
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
我想在线上写一个int32和一个8B的char。对于我写的整数
out.printf("%04x",1);
它在wireshark上显示为“30 30 30 31”,而我希望它显示为“01 00 00 00”。同样适用于out.printf(“%d”,1);它显示为“31”,而我想要它“01 00 00 00”。如何在线上写入4B的整数和8B的字符?表示是否与编码有关?
答案 0 :(得分:2)
使用PrintWrite将文本写入套接字并不理想,因为它会隐藏任何错误。
在你的情况下,你似乎想要写二进制文件,所以我建议你试试。
DataOutputStream out = new DataOutputStream(
new BufferedOutputStream(clientSocket.getOutputStream()));
out.writeInt(1);
但是如果你想采用小端格式,我会使用阻塞NIO。
SocketChannel sc =
ByteBuffer bb= ByteBuffer.allocateDirect(1024).order(ByteOrder.LITTLE_ENDIAN);
bb.putInt(1);
// put whatever else
bb.flip();
while(bb.remaining() > 0) sc.write(bb);
答案 1 :(得分:1)
是。通过指定“%04x”和字符串转换,您可以隐式选择数据的十六进制编码(即将数字转换为ASCII字符串)。
使用ByteBuffer
代替将整数转换为四个字节。请参阅this answer for details。
答案 2 :(得分:1)
如果要编写二进制数据,请不要将PrintWriter或任何其他Writer用作包装器。请尝试使用DataOutputStream,它提供了一组用于编写整数的方法,等等。