0

我想解析一个包含 8 个十六进制数字(4 字节)的字符串,但我得到了 NumberFormatException。这里有什么问题?

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

5 回答 5

3

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

Long.parseLong("FFFF4C6A", 16);

这给出了 4294921322。

文档

NumberFormatException如果发生以下任何一种情况,则会引发类型异常:

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

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

于 2012-09-13T09:35:49.620 回答
2

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

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

如果发生以下任何一种情况,则会引发NumberFormatException类型的异常:

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

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

可能的解决方案:为了解析这个,使用Long.parseLong(...)MAX_VALUE 定义为`public static final long MAX_VALUE = 0x7fffffffffffffffL

于 2012-09-13T09:34:01.987 回答
1

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

new BigInteger("FFFF4C6A", 16).intValue()
于 2014-04-07T10:35:54.167 回答
1

您已超出整数范围。

Integer.MAX_VALUE = 2147483647
0xFFFF4C6A = 4294921322

将其解析为Long作品:

Long.parseLong("FFFF4C6A",16)
于 2012-09-13T09:34:46.797 回答
0

我不知道 assertThat() 方法,但是您的十六进制数字“FFFF4C6A”对于整数来说太大了。

例如,如果你写:

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

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

双数 = Integer.parseInt("FFFF4C6A",16)

于 2012-09-13T09:40:00.317 回答