数据报包到字符串
Posted
技术标签:
【中文标题】数据报包到字符串【英文标题】:DatagramPacket to string 【发布时间】:2011-12-19 04:35:45 【问题描述】:尝试将接收到的 DatagramPacket 转换为字符串,但我有一个小问题。不知道最好的方法是什么。
我将接收到的数据大多是未知长度的,因此我在接收端设置了一些缓冲区[1024]。问题是,假设我发送了字符串“abc”并在接收方执行以下操作...
buffer = new byte[1024];
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
buffer = packet.getData();
System.out.println("Received: "+new String(buffer));
我得到以下输出:abc[][][][]][][][]..... 一直到缓冲区长度。 我猜最后所有的垃圾/空值都应该被忽略,所以我一定做错了什么。”我知道 buffer.length 是问题,因为如果我将它更改为 3(对于这个例子),我的出来就好了。
谢谢。
【问题讨论】:
【参考方案1】:new String(buffer, 0, packet.getLength())
【讨论】:
不幸的是,这不起作用。出局变得完全荒谬。并且 eclipse 还警告说方法 String(byte[], int) 已被弃用。当我用要接收的字符串的确切长度初始化他的缓冲区时,一切正常,但仍然遇到同样的问题。字符串的长度不会提前知道。 这确实有效,但是 new String(buffer, 0, packet.getLength());谢谢一百万。【参考方案2】:改用此代码:
String msg = new String(packet.getData(), packet.getOffset(), packet.getLength());
【讨论】:
【参考方案3】:DatagramPacket 的长度字段给出了实际接收到的数据包的长度。更多详情请参考javadocDatagramPacket.receive
。
因此您只需使用不同的String
构造函数,传递字节数组和实际接收到的字节数。
例如,请参阅 @jtahlborn 或 @GiangPhanThanhGiang 的答案。
然而,在将字节解码为 UTF-16 字符串时,仍然存在应该使用哪种字符编码的问题。对于您的特定示例,这可能无关紧要。但是如果您传递的数据可能包含非 ASCII 字符,那么您需要使用正确的字符集进行解码。如果你弄错了,你的String
值很可能会出现乱码。
【讨论】:
【参考方案4】:据我了解,DatagramPacket 最后只有一堆垃圾。正如 Stephen C. 建议的那样,您也许能够找到收到的实际长度。在这种情况下,请使用:
int realSize = packet.getLength() //Method suggested by Stephen C.
byte[] realPacket = new byte[realSize];
System.arrayCopy(buffer, 0, realPacket, 0, realSize);
至于找到长度,我不知道。
【讨论】:
如果您要投反对票,请解释原因,以便我下次修改帖子。简单地投票没有帮助。 您的原始答案没有提供有关获取数据包长度的任何有意义的信息,这基本上就是问题所在。另外,一旦知道数据包长度,就不需要复制数组了。 复制是将缓冲区大小从1024减小到数据包大小。 知道实际数据包大小后就不需要复制了。例如`new String(packet.getData(), packet.getOffset(), packet.getLength()); “至于寻找长度”,你已经找到了。答案完全不清楚。【参考方案5】:试试
System.out.println("Received: "+new String(buffer).trim());
或
String sentence = new String(packet.getData()).trim();
System.out.println("Received: "+sentence);
【讨论】:
【参考方案6】:改用此代码
buffer = new byte[1024];
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String data = new String(packet.getData());
System.out.println("Received: "+data);
【讨论】:
为什么要用这个代码?仅仅代码不是答案。你必须解释。这个特定的代码并不比 OP 的原始代码更好,因为它在语义上是相同的。以上是关于数据报包到字符串的主要内容,如果未能解决你的问题,请参考以下文章