2014-11-03 132 views
-2

我想將字符串數組轉換爲字節數組,然後使用下面的代碼字符串。Java:CSV字符串到字節數組

當字節介於-128到127之間時它工作正常,但是當字節介於0到256之間時(例如133或155等),我試圖轉換大於127的字符,例如:

java.lang.NumberFormatException: Value out of range. value:"133"

String response = "[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97]"; 
String[] byteValues = response.substring(1, response.length() - 1).split(","); 
byte[] bytes = new byte[byteValues.length]; 

for (int i=0, len=bytes.length; i<len; i++) { 
    bytes[i] = Byte.valueof(byteValues[i].trim());  
} 

String str = new String(bytes); 

任何幫助?

+0

您似乎想要將輸入視爲無符號字節。那麼你對-47有什麼期望呢? – Boann 2014-11-03 16:47:04

+0

實際上.doc,.docx文件使用.NET轉換爲字節數組,並通過WCF服務返回響應。在android中,我正在解碼該字節數組以顯示該文件。因此,該字節數組包含一些值超過127像133,147,196等, – 2014-11-03 17:42:07

+0

如何從該值檢索字符串 – 2014-11-03 17:42:46

回答

0

如果值大於127,則需要將它們存儲在int數據類型中。現在將它們存儲在字節afaik中。

+0

如果我存儲在一個int數據類型,我無法從該字節獲得確切的字符串。 – 2014-11-03 16:48:54

+0

沒有其他辦法?短,字符,長? – ControlAltDel 2014-11-03 16:49:25

+0

@ControlAltDel我的不好。錯誤措辭,現在糾正。 – 2014-11-03 16:50:46

0

Java的「字節」類型不幸被簽名。用它來存儲無符號字節值(從0到255),使用int,它截斷成一個字節存儲時:

bytes[i] = (byte)Integer.parseInt(byteValues[i].trim()); 

如果要恢復原來的無符號值,並將它與0xFF的(這將其以無符號方式轉換爲int)。例如:

for (byte b : bytes) { 
    System.out.println(b & 0xFF); 
} 

在您的輸入數組的-47是沒有意義在這一背景下,將被解釋爲256 - 47 = 209


編輯:構造new String(bytes)是不安全的,因爲它使用未指定的字符集。相反,請指定一個特定的字符集,無論使用哪一個。例如:

String str = new String(bytes, java.nio.charset.StandardCharsets.UTF_8); 
+0

我試過這個,但我的問題是我得到的服務器響應包含0到256的字節數組,如果我嘗試解碼該字節數組到字符串我得到正確的字符串時,字節是介於0到128之間並獲得?????如果字節超過127.如何解碼該字節來糾正字符串或有任何方式,而不是字節數組。 – 2014-11-03 17:26:07

+0

@VinayKrishna您需要使用相同的字符集來解碼數據,這與服務器用於編碼數據的字符集無關。 – Boann 2014-11-03 17:31:09

1

%的Java文檔,一個字節由原始字節這是爲「8位有符號二進制補碼整數」實現支持這個具有-128到127最大射程,不能處理任何其他值。

http://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

+0

更重要的是,除非你已經將charset設置爲可以將負整數實際讀爲有效字符的東西;從這樣的有符號整數中構建一個字符串不會產生有效的字符串。 – Malchia7 2014-11-03 16:56:57

0

字節只能有值高達127(2^7 - 1)(符號表示)。