1
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 个十六进制并转换为字节。

编辑:

我是如何解决的:

String hexInBinary = String.format("%8s", Integer.toBinaryString(Integer.parseInt(hex, 16))).replace(' ', '0');
keyArray[row][col] = (byte)Integer.parseInt(hexInBinary, 2);
4

3 回答 3

1

正如异常消息中所写,您尝试转换为字节的字符串超过了最大值。一个字节的值可以有。

在您的示例中,字符串“10010011”等于 147,但字节变量的最大值为 2^7 - 1 = 127。

您可能需要查看 Byte Class 文档; http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Byte.html#MAX_VALUE

所以我建议使用Integer.parseInt(), 而不是 parseByte 方法,然后将 int 值转换为字节,当您将整数值 147 转换为字节值时,它将变为 -109。

于 2013-10-30T00:32:04.800 回答
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 检测到一个比 a“更大”的值byte

于 2013-10-30T00:34:24.423 回答
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。有符号字节的最大值127(因为如果最高有效位为 1,则将其解释为负数)。但是,问题parseByte()在于它改为使用显式的“-”符号而不是 1 来表示负数。这意味着“字节”的其余部分只能使用 7 位。

于 2013-10-30T00:44:14.957 回答