2012-02-08 88 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

相關問題