我正在尝试将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);
任何帮助?!
答案 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)(带符号的表示)。