将hex字符串解析为int值时出现意外的NumberFormatException
我想解析一个包含8个hex数字(4字节)的字符串,但我得到了一个NumberFormatException。 这有什么不对?
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()