public static byte[][] keyArray = new byte[4][4];
String hex = "93";
String hexInBinary = Integer.toBinaryString(Integer.parseInt(hex, 16));
keyArray[row][col] = Byte.parseByte(hexInBinary,2); //this line causes the error
这是我收到的错误消息,
"Exception in thread "main" java.lang.NumberFormatException: Value out of range. Value:"10010011" Radix:2."
我不想使用getBytes(),因为我实际上有一个长字符串,“0A935D11496532BC1004865ABDCA42950”。我想一次读取2个十六进制并转换为byte。
编辑:
我是如何修理的:
String hexInBinary = String.format("%8s", Integer.toBinaryString(Integer.parseInt(hex, 16))).replace(' ', '0');
keyArray[row][col] = (byte)Integer.parseInt(hexInBinary, 2);
答案 0 :(得分:1)
在异常消息中写入时,您尝试转换为byte的字符串超出最大值。一个字节的值可以有。
在您的示例中,字符串“10010011”等于147,但字节变量的最大值为2 ^ 7 - 1 = 127.
您可能需要检查字节类文档; http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Byte.html#MAX_VALUE
所以我建议使用Integer.parseInt()
而不是parseByte方法,然后将int值转换为byte,当你将其转换为字节值时,整数值147将变为-109。
答案 1 :(得分:1)
public class ByteConvert {
public static void main(String[] argv) {
String hex = "93";
String hexInBinary = Integer.toBinaryString(Integer.parseInt(hex, 16));
int intResult = Integer.parseInt(hexInBinary,2);
System.out.println("intResult = " + intResult);
byte byteResult = (byte) (Integer.parseInt(hexInBinary,2));
System.out.println("byteResult = " + byteResult);
byte result = Byte.parseByte(hexInBinary,2);
System.out.println("result = " + result);
}
}
C:\JavaTools>java ByteConvert
intResult = 147
byteResult = -109
Exception in thread "main" java.lang.NumberFormatException: Value out of range.
Value:"10010011" Radix:2
at java.lang.Byte.parseByte(Unknown Source)
at ByteConvert.main(ByteConvert.java:9)
可以看出,parseByte检测到的值“大于”byte
。
答案 2 :(得分:0)
根据http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Byte.html#parseByte(java.lang.String)的java文档,
"The characters in the string must all be digits, of the specified radix
(as determined by whether Character.digit(char, int) returns a nonnegative
value) except that the first character may be an ASCII minus
sign '-' ('\u002D') to indicate a negative value."
所以二进制表示是不两个赞美。假设高位为1,则二进制补码表示法中的字节10010011将为负。因此,如果要获得与二进制补码字节10010011相同的值,则需要执行Byte.parseByte("-1101100");
。
换句话说,无符号字节可以有的最大值是255. signed 字节可以有的最大值是127(因为如果最高有效位是1,那么它是解释为负数)。但是,parseByte()
的问题在于它使用明确的“ - ”符号而不是1来表示负数。这意味着“字节”的其余部分只能使用7位。