将十六进制字符串转换为字节中的二进制字符串抛出NumberFormatException

时间:2013-10-30 00:17:14

标签: java binary hex numberformatexception

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);

3 个答案:

答案 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位。