2013-11-03 39 views
0

我正在制作一个需要通过互联网接收数据的程序。它使用DatagramSockets并接收DatagramPackets。这一切工作正常,它收到的字节数组是我所期望的。NumberFormatException有效数字字符串

但是,当我尝试将字节数组转换为字符串,然后转换为整数时,会发生很奇怪的事情。

运行下面的代码给出了一个NumberFormatException异常的parseInt行:

String length = new String(data, 1, data.length-1); 
System.out.println("length = "+length); 
size = Integer.parseInt(length); 
System.out.println("size = "+size); 

然而,当我检查的data内容,我看到,它只是包含55,52,49,56,53,0,0,0,0,0,0,0,0,0,0,0,0,这是很好的,这是字符串“74185 ”。这引发了异常。

当我硬编码“74185”作为length字符串时,一切都很好。

这里可能会出现什么问题?

+0

您确定您正在适当注意从网络中读取的字节数吗?你有没有考虑过将一个显式编码传递给String构造函数?你是否在十六进制中一次只输出一个字符串? – bmargulies

回答

5

您的字符串包含嵌入的\0个字符。在Java中,它们是字符串的一部分,而不是C.

因此,您首先需要在字符串中找到第一个出现的\0,然后将子字符串置于该位置。

-1

由于您使用的构造函数错误而失败。这是String(byte\[\],index,length)。第一个参数data是正确的。第二个应该是0(数组的起点为0),第三个应该是data.length

您可以直接使用new String(data)来使用整个数组。

编辑:正如Roland Illig指出的那样,您的数组包含\0个字符,这会破坏您的号码。你应该在调用之前摆脱那些\0s,或者检查第一个\0的索引并将其用作上述构造函数+1的第三个参数。

无论如何,如果你想发送一个号码,为什么不发送一个数字,而不是你必须解析的字符串?

+1

这不起作用,因为字符串仍然包含'\ 0'字符。 –

相关问题