我目前正在读取UDP字节数组,我知道这是一个字符串,我知道所述字符串的最大可能长度。所以我打印出一个字符串(通常比最大长度短)。我可以将它打印出来,但它打印出文本然后是垃圾字符。有没有办法在不知道有效文本的实际长度的情况下修剪垃圾二进制数据?
String result = new String(input, Charset.forName("US-ASCII"));
我会尝试那些要求更多数据的人。以下是UDP消息的读取方式:
sock.receive(incoming);
byte[] data = incoming.getData();
String s = new String(data, 0, incoming.getLength());
UDP消息本身将包含固定大小的标头,然后是一组数据(最大大小为1024字节)。该数据可以是int,string,byte等。这由头数据确定。因此,根据类型,我会根据适当的大小块来删除数据。我关注的问题是String类型的数据。我知道字符串的最大大小将是每个字符串128个字节,所以我通过dataArray是字节数组来读取数据块。:
for (int i = 0; i < msg.length; i = i + readSize)
{
dataArray = Arrays.copyOfRange(msg, i, i + readSize);
}
然后我使用本文第一个代码集中的原始代码将数据放入字符串对象中。事实上,通常发送的文本少于为最大大小分配的128个字节。因此,当我打印字符串时,我得到有效的文本,然后是空格和非正常的ascii字符(垃圾数据)。希望这种补充有所帮助。
输出的一个例子就在这里。达到.mof的所有内容都有效:
答案 0 :(得分:1)
有没有办法在不知道实际情况的情况下修剪垃圾二进制数据 有效文本的长度?
是的,您只需致电trim()
,它就会移除尾随的null characters。确实trim()
删除了小于或等于\u0020
(又名空白)的每个前导和尾随字符,其中包括\u0000
(也就是空字符)。
byte[] bytes = "foo bar".getBytes();
// Simulate message with a size bigger than the actual encoded String
byte[] msg = new byte[32];
System.arraycopy(bytes, 0, msg, 0, bytes.length);
// Decode the message
String result = new String(msg, Charset.forName("US-ASCII"));
// Trim the result
System.out.printf("Result: '%s'%n", result.trim());
<强>输出:强>
Result: 'foo bar'
答案 1 :(得分:0)
好的,我是如何让它工作的。这是一种相当手动的方法,但在使用之前
String result = new String(input, Charset.forName("US-ASCII"));
将字节数组合成一个字符串,我查看每个字节并确保它在0x20 - 0x7e的可打印范围内。如果没有,我用空格(0x20)替换该值。然后用字符串上的.trim结束。