2012-02-08 43 views
0
Integer.parseInt("ff8ca87c", 16); 

这给了我一个NumberFormatException出于某种原因。你知道这是为什么吗?为什么此Java parseInt十六进制字符串导致NumberFormatException?

Exception in thread "main" java.lang.NumberFormatException: For input string: "ff8ca87c" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.valueOf(Unknown Source) 
+0

你试过0xff8ca87c了吗? – John3136 2012-02-08 09:33:38

+0

@ John3136是的,它也不起作用 – Ignoreme 2012-02-08 09:34:34

+0

@ John3136 - 该规范根本没有提到“0x”前缀。 – Polynomial 2012-02-08 09:34:58

回答

6

失败的原因是,你试图把+0xff8ca87c成符号整数。 32位有符号整数的最大值为+0x7fffffff,因为最高有效位用于存储符号。

尝试使用long代替。 64位带符号int的最大值是0x7fffffffffffffff,在这种情况下,这对您的需求来说已经足够了。

或者,在Java 8中,您可以使用Integer.parseUnsignedInt("ff8ca87c", 16);将其视为无符号整数。

+0

谢谢,我并没有真正想到这一点。我混淆了有符号和无符号的int边界。不幸的是,我将不得不测试是否解析为long,并且转换回int来影响比特的值(讨厌的符号位!) – Ignoreme 2012-02-08 09:49:36

+1

令人惊讶的是,这些位在整个转换过程中都保持一致。有用! – Ignoreme 2012-02-08 09:54:26

+1

您可能会发现Guava的[UnsignedInts.parseUnsignedInt](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/primitives/UnsignedInts.html#parseUnsignedInt(java.lang .String,%20int))相关。 – 2012-02-08 19:12:04

相关问题