2012-06-25 24 views
78

Próbuję przekonwertować ciąg znaków o długości 8 znaków z kodu szesnastkowego na liczbę całkowitą, aby umożliwić porównanie zamiast porównywania ciągów w wielu różnych wartościach.Konwertuj ciąg szesnastkowy na int

Wiem, że jest to dość trywialne w C++, ale muszę to zrobić w Javie. Przypadek testowy, który muszę spełnić, polega w zasadzie na zamianie "AA0F245C" na int, a następnie z powrotem na ten ciąg, aby wiedzieć, że konwersja jest właściwa.

Próbowałem następujące:

int decode = Integer.decode("0xAA0F245C"); // NumberFormatException 
int decode2 = Integer.decode("AA0F245C"); //NumberFormatException 
int parseInt = Integer.parseInt("AA0F245C", 16); //NumberFormatException 
int valueOf = Integer.valueOf("AA0F245C", 16); //NumberFormatException 

Próbowałem również robi to dwie postacie naraz i mnożąc wyniki, w której pracuje, ale liczba konwersji nie jest słuszne.

int id = 0; 
for (int h = 0; h < hex.length(); h= h+2) 
{ 
    String sub = hex.subSequence(h, h+2).toString(); 

if (id == 0) 
    id = Integer.valueOf(sub, 16); 
else 
    id *= Integer.valueOf(sub, 16);    
} 
//ID = 8445600 which = 80DEA0 if I convert it back. 

Nie mogę korzystać z bibliotek stron trzecich, więc wiesz, więc to musi być zrobione w standardowych bibliotekach Java.

Dziękuję za pomoc z góry.

+0

Ty mnożą się, kiedy powinna być przesuwanie. –

+7

'0xAA0F245C = 2853119068' ale' Integer.MAX_VALUE = 0x7fffffff = 2147483647' – Pshemo

+4

Wiem, że pytanie istnieje już od dwóch lat. Jednak java 8 umożliwia inne rozwiązanie. Dodali metodę 'Integer.parseUnsignedInt (" value ", radix)', która służy twojemu celowi. Jeśli wartość jest większa niż "Integer.MAX_VALUE", jest odwzorowana na liczbę ujemną. – John

Odpowiedz

115

Jest po prostu zbyt duży dla int (który ma 4 bajty i jest podpisany).

Zastosowanie

Long.parseLong("AA0F245C", 16); 
+3

Niesamowite dziękuję! Prawdopodobnie powinienem to wiedzieć. Ale to sprawia, że ​​czuję się lepiej, że żadna z 4 osób, o które prosiłem przed wysłaniem, nie wiedziała o tym :). Na marginesie, muszę teraz dowiedzieć się, dlaczego ta osoba napisała kod, którego potrzebuję, aby porównać ints, aby je zawierały jako ints, a nie longs ... co prawdopodobnie oznacza, że ​​coś innego jest wyłączone. Poza tym ... dziękuję za szybką odpowiedź !!!! Przekleństwo java za twój straszny komunikat o błędzie ... "To jest duże" byłoby pomocne. – Roloc

+1

"Byłoby duże" byłoby pomocne. " Java nie jest kobietą ... –

13

Maksymalna wartość którą można Java Integer jest uchwyt 2147483657 lub 2^31-1. Numer szesnastkowy AA0F245C jest 2853119068 jako liczbę dziesiętną, i jest zbyt duży, więc trzeba użyć

Long.parseLong("AA0F245C", 16); 

aby to działało.

+0

off: interesujące, że bardziej szczegółowa odpowiedź, ale 5 minut później dostaje tylko 1 przegłosowanie w porównaniu do 14. Chociaż prawda, ta nie powiedziała magiczne "4 bajty" i "podpisane" ... hm. – n611x007

6

możesz to łatwo zrobić za pomocą parseInt z parametrem formatu.

Integer.parseInt("-FF", 16) ; // returns -255 

javadoc Integer

+4

Czy próbowałeś tego z pełnym tekstem, który napisałem? – Roloc

15

można użyć jak ten

System.out.println(Integer.decode("0x4d2")) // output 1234 
//and vice versa 
System.out.println(Integer.toHexString(1234); // output is 4d2); 
+0

Podoba mi się ta odpowiedź, nie wiedziałem, że istnieje ogólna, typinsensitive metoda dla tego w klasie Integer. dzięki za wiedzę. – Gewure

1

To jest właściwa odpowiedź:

myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)