我正在使用字节数组来存储从另一台计算机收到的数据包。
receivedData = new byte[1024];
receivedPacket = new DatagramPacket(receivedData, receivedData.length);
socket.receive(receivedPacket);
receivedData = receivedPacket.getData();
String res = new String(receivedData); // PROBLEM HERE
问题出在最后一行:因为我将receivedData
声明为长度为1024的字节流。所以,总是最后一行会从整个数组创建一个新字符串,尽管它并不确切知道有多少真实字符串我收到的字节。所以,我遇到了沮丧的错误:res
没有按照我的意愿收到。 (因为我收到的实际字节长度没有修复整个数组)
所以,我的问题是:如何解决这一点,我怎么知道我真正收到多少字节转换为字符串?
答案 0 :(得分:4)
尝试使用DatagramPacket.getLength()
。
receivedData = new byte[1024];
receivedPacket = new DatagramPacket(receivedData, receivedData.length);
socket.receive(receivedPacket);
receivedData = receivedPacket.getData();
String charsetName = "US-ASCII"; // set to desired charset
String res = new String(receivedData, 0, receivedPacket.getLength(), charsetName);
编辑添加字符集。谢谢,parsifal。
答案 1 :(得分:2)
来自DatagramSocket.receive()
的{{3}}:
数据报包对象的长度字段包含长度 收到的消息
然后,您可以使用带有字节数组和偏移量的构造函数构造String
。
答案 2 :(得分:2)
调用DatagramPacket.getLength()以查明实际接收的字节数。
当你从这些字节构造String
时,一定要指定编码(因为它是,你使用的是JDK默认编码,它可能与服务器的不同)编码)。