Java:CSV字符串到字节数组

时间:2014-11-03 16:41:52

标签: java string byte

我正在尝试将String数组转换为Byte数组,然后使用以下代码转换为字符串。

当字节在-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);

任何帮助?!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果值大于127,则需要将它们存储在int数据类型中。现在将它们存储在字节 afaik 中。

答案 2 :(得分:0)

遗憾的是,Java的“字节”类型已签名。要使用它来存储无符号字节值(从0到255),请使用int并在存储时将其截断为一个字节:

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

如果要恢复原始无符号值,则使用0xFF(将其以无符号方式转换为int)。 E.g:

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

输入数组中的-47在此上下文中没有任何意义,并且将被解释为256 - 47 = 209。


编辑:构造函数new String(bytes)不安全,因为它使用了未指定的字符集。而是指定一个特定的字符集,无论您使用哪个字符集。 E.g:

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

答案 3 :(得分:0)

字节最多只能有127(2 ^ 7 - 1)(带符号的表示)。