[ Java ] Integer Hex 與 Decimal 數值轉換

最近碰到一個問題

Android取出顏色的數值是 int 型態

例如 Color.BLACK 數值為 -16777216       <<< 負數?

透過 Integer.toHexString(int i) 方法將數值轉成 Hex

結果為String 型態的 ff000000 << ARGB 數值

問題來了,如果要將 ff000000 轉回 int 型態

例如使用 Integer.parseInt("ff000000",16) 處理

執行時則會拋出 Exception

java.lang.NumberFormatException: Invalid int: "ff000000"

這時該怎麼處理才可以將 Hex 轉回 Decimal ??





上網查了好久,在StackOverflow看到一個解答


https://stackoverflow.com/questions/12005424/java-converting-int-to-hex-and-back-again


以下取自內文解答


The reason why it doesn't work your way: Integer.parseInt takes a signed int, while toHexString produces an unsigned result. So if you insert something higher than 0x7FFFFFF, an error will be thrown automatically. If you parse it as long instead, it will still be signed. But when you cast it back to int, it will overflow to the correct value.


大概的意思是說,Integer.parseInt可以接受 signed 的數值

而 toHexString 則是回傳 unsigned 的數值

所以當你將高於 0x7FFFFFF 的數值傳入 Integer.parseInt 後會自動拋出錯誤

但如果你是使用 long 的型態去處理,並且將其強制轉為 int 型態

這時數值會因為溢位而還原為原本的負數數值


所以使用以下方法即可解決問題


int parsedResult = (int) Long.parseLong(hex, 16);














沒有留言:

張貼留言

Layout疑難雜症筆記

 這裡記錄一些Layout時View元件比較特殊的狀況與處理方式,內容會陸續增加。