将十六进制字符串解析为int值时出现意外的NumberFormatException

时间:2012-09-13 09:25:42

标签: java hex

我想解析一个包含8个十六进制数字(4字节)的字符串,但我得到了一个N​​umberFormatException。这有什么不对?

assertThat(Integer.parseInt("FFFF4C6A",16),is(0xFFFF4C6A));

5 个答案:

答案 0 :(得分:3)

您的数字代表的数字大于可分配给int的数字。尝试:

Long.parseLong("FFFF4C6A", 16);

,它给出了4294921322。

来自doc

  

如果出现以下任何一种情况,则抛出类型NumberFormatException的异常:

     
      
  • 第一个参数为null或是一个长度为零的字符串。
  •   
  • 基数小于Character.MIN_RADIX或大于Character.MAX_RADIX
  •   
  • 字符串的任何字符都不是指定基数的数字,...
  •   
  • 字符串表示的值不是int类型的值。
  •   

这是你遇到的第四个案例。

答案 1 :(得分:2)

这是因为提供的Integer.parseInt("FFFF4C6A",16)超过Integer.MAX_VALUE,定义为public static final int MAX_VALUE = 0x7fffffff;

现在,根据parseInt(...)的Javadoc,您可以在以下任一情况下点击 NumberFormatException

如果出现以下任何一种情况,则抛出 NumberFormatException 类型的异常:

  
      
  • 第一个参数为null或是一个长度为零的字符串。
  •   
  • 基数小于Character.MIN_RADIX或大于Character.MAX_RADIX。
  •   
  • 字符串的任何字符都不是指定基数的数字,除了第一个字符可能是减号' - '('\ u002D')或   加号'+'('\ u002B'),条件是字符串长于   长度1。
  •   
  • 字符串表示的值不是int类型的值。
  •   

在您的情况下,由于提供的String值超过Integer.MAX_VALUE,因此您满足 NumberFormatException 的第4个子句

可能的解决方案:为了解析此问题,请使用Long.parseLong(...),其中MAX_VALUE定义为`public static final long MAX_VALUE = 0x7fffffffffffffffL

答案 2 :(得分:1)

您已超出整数范围。

Integer.MAX_VALUE = 2147483647
0xFFFF4C6A = 4294921322

将其解析为Long有效:

Long.parseLong("FFFF4C6A",16)

答案 3 :(得分:1)

如果您只想将十六进制字符串表示为整数(因为它是32位),则需要使用BigInteger

new BigInteger("FFFF4C6A", 16).intValue()

答案 4 :(得分:0)

我不知道assertThat()方法,但是你的十六进制数" FFFF4C6A"是一个大整数。

例如,如果你写:

  

int number = Integer.parseInt(" FFFF4C6A",16)

你会得到同样的错误。 编写代码的正确方法是:

  

double number = Integer.parseInt(" FFFF4C6A",16)