Próbuję przekonwertować ciąg o długości 8 znaków kodu szesnastkowego na liczbę całkowitą, tak żebym mógł wykonać porównanie int zamiast porównywania ciągów w wielu różnych wartościach.
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 przekonwertowaniu „AA0F245C” na int, a następnie z powrotem na ten ciąg, aby wiedzieć, że konwertuje się prawidłowo.
Próbowałem następujących rzeczy:
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ż zrobić to po dwa znaki na raz i pomnożyć wyniki, co oznacza, że konwersja działa, ale liczba jest nieprawidłowa.
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 innych firm, abyś wiedział, więc należy to zrobić w standardowych bibliotekach Java.
Z góry dziękuję za pomoc.
0xAA0F245C = 2853119068
aleInteger.MAX_VALUE = 0x7fffffff = 2147483647
Integer.parseUnsignedInt("value",radix)
metodę, która służy twojemu celowi. Jeśli wartość jest większa, niżInteger.MAX_VALUE
jest mapowana na liczbę ujemną.Odpowiedzi:
Jest po prostu za duży na int (który ma 4 bajty i jest podpisany).
Posługiwać się
źródło
NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"
... Rozwiązanie?BigInteger
klasy:BigInteger value = new BigInteger(valueString, 16)
możesz używać w ten sposób
źródło
Maksymalna wartość, jaką
Integer
może obsłużyć Java, to 2147483657 lub 2 ^ 31-1. Liczba szesnastkowa AA0F245C to 2853119068 jako liczba dziesiętna i jest o wiele za duża, więc musisz użyćżeby to działało.
źródło
możesz to łatwo zrobić za pomocą parseInt z parametrem format.
javadoc Integer
źródło
Oto właściwa odpowiedź:
myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)
źródło
Dla tych z Was, którzy chcą przekonwertować szesnastkową reprezentację podpisanego bajtu z dwuznakowego ciągu na bajt (który w Javie jest zawsze podpisany), jest przykład. Parsowanie ciągu szesnastkowego nigdy nie daje liczby ujemnej, co jest błędne, ponieważ 0xFF wynosi -1 z pewnego punktu widzenia (kodowanie dopełniające do dwóch). Zasada polega na przeanalizowaniu przychodzącego String jako int, który jest większy niż bajt, a następnie zawijaniu liczb ujemnych. Pokazuję tylko bajty, więc ten przykład jest wystarczająco krótki.
Można to edytować, aby przetwarzać dłuższe liczby. Po prostu dodaj odpowiednio więcej FF lub 00. Aby przeanalizować 8 liczb całkowitych ze znakiem szesnastkowym ze znakiem, należy użyć Long.parseLong, ponieważ FFFF-FFFF, który jest liczbą całkowitą -1, nie pasuje do liczby całkowitej, gdy jest reprezentowana jako liczba dodatnia (daje 4294967295). Potrzebujesz więc Long do przechowywania. Po konwersji na liczbę ujemną i rzutowaniu z powrotem na liczbę całkowitą, będzie pasować. Nie ma 8-znakowego ciągu szesnastkowego, który nie pasowałby na końcu do liczby całkowitej.
źródło
Dodatkową opcją do tych sugerowanych jest użycie
BigInteger
klasy. Ponieważ wartości szesnastkowe są często dużymi liczbami, takimi jak wartości sha256 lub sha512, z łatwością przepełnią anint
i along
. Podczas gdy konwersja na tablicę bajtów jest opcją, jak pokazują inne odpowiedziBigInterger
, często zapomniana klasa w java jest również opcją.źródło
źródło
Spróbuj z tym:
long abc = convertString2Hex ("1A2A3B");
źródło