Java中的十六进制转整数格式异常

5

当我尝试执行时,出现了数字格式异常。

int temp = Integer.parseInt("C050005C",16);

如果我减少十六进制数字中的一个数字,它会转换,但反之则不行。为什么?如何解决这个问题?

4个回答

14

在Java中,由于整数始终带符号,因此这将导致整数溢出。从该方法的文档中可以看到(我加了重点):

如果发生以下任何情况之一,则引发 NumberFormatException 异常:

  • 第一个参数为 null 或长度为零的字符串。
  • 基数小于 Character.MIN_RADIX 或大于 Character.MAX_RADIX。
  • 字符串的任何字符都不是指定基数的数字,但如果该字符串的长度大于 1,则第一个字符可以是减号 '-' ('\u002D')。
  • 字符串表示的值不是 int 类型的值。

然而,它可以适合于 符号整数。从Java 8开始,有Integer.parseUnsignedInt可用(感谢Andreas):

int temp = Integer.parseIntUnsigned("C050005C",16);

在早期的Java版本中,您最好使用long,然后将该long的低4个字节放入一个int中。

long x = Long.parseLong("C050005C", 16);
int y = (int) (x & 0xffffffff);

也许你甚至可以在这里省略按位“与”操作,但是我现在无法测试。但是这样可能会缩短代码为:

int y = (int) Long.parseLong("C050005C", 16);

1
“但这在Java中不是一个选项”这种说法已经不再正确,因为自从Java 8之后,我们可以使用Integer.parseUnsignedInt(String s, int radix)方法来实现无符号整数的解析。当然,你也需要使用Integer.toUnsignedString(int i)方法来打印无符号整数的值。 - Andreas

5

C050005C是3226468444的十进制表示,这比Integer.MAX_VALUE还要大。它不能存储在int中。


4
请使用以下代码:

long temp = Long.parseLong("C050005C", 16);

该代码用于将十六进制字符串转换为长整型数值。

2
signed int 类型的范围是从 0x7FFFFFFF 到 -0x80000000。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接