2013-11-03 50 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'字符。 –

相關問題