将hex字符串解析为int值时出现意外的NumberFormatException

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

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

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

 Long.parseLong("FFFF4C6A", 16); 

其中4294921322。

从文档 :

如果发生以下任何一种情况,则抛出NumberFormatException类型的exception:

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

这是你打的第四个案例。

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

现在,根据parseInt(…)的Javadoc ,您将在以下任一情况下遇到NumberFormatException

如果发生以下任何一种情况,则抛出NumberFormatException类型的exception:

  • 第一个参数为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

你已经超出了整数的范围。

 Integer.MAX_VALUE = 2147483647 0xFFFF4C6A = 4294921322 

将其解析为Long作品:

 Long.parseLong("FFFF4C6A",16) 

我不知道assertThat()方法,但你的hex数“FFFF4C6A”对于整数来说是大的。

例如,如果你写:

int number = Integer.parseInt(“FFFF4C6A”,16)

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

double number = Integer.parseInt(“FFFF4C6A”,16)

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

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