Liczba całkowita do dwóch cyfr szesnastkowych w Javie

82

Muszę zmienić wartość całkowitą na 2-cyfrową wartość szesnastkową w Javie. Czy jest na to jakiś sposób. Dzięki

Moja największa liczba to 63, a najmniejsza 0. Potrzebuję wiodącego zera dla małych wartości.

Salih Erikci
źródło
Chcesz to wydrukować? musisz zamienić go w ciąg?
Ahmed Masud
Napiszę do pliku jako dwucyfrowe szesnastkowe
Salih Erikci
Czy przynajmniej sprawdziłeś Integer javadoc? Jak planujesz przekonwertować 12345656 na 2-cyfrową wartość szesnastkową?
JB Nizet

Odpowiedzi:

147
String.format("%02X", value);

Jeśli używasz Xzamiast, x jak sugeruje aristar , nie musisz używać .toUpperCase().

GabrielOshiro
źródło
8
To jest obecnie najlepsza odpowiedź.
David J.
1
Uzgodniono, że ten jest znacznie lepszy niż którykolwiek z pozostałych. Działa doskonale. Jedyne co bym zasugerował to trochę dokładniejszy opis parametrów przekazywanych do metody. Musiałem sprawdzić, czy przekazałem wartość jako liczbę całkowitą, czy jako ciąg szesnastkowy.
JRSofty
31
Integer.toHexString(42);

Javadoc: http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#toHexString(int)

Pamiętaj jednak, że może to dać więcej niż 2 cyfry! (Liczba całkowita ma 4 bajty, więc potencjalnie możesz odzyskać 8 znaków).

Oto mały hack, aby uzyskać dopełnienie, o ile masz absolutną pewność, że masz do czynienia tylko z wartościami jednobajtowymi (255 lub mniej):

Integer.toHexString(0x100 | 42).substring(1)

O wiele więcej (i lepszych) rozwiązań w Lewy dopełnianie liczb całkowitych (format niedziesiętny) zerami w Javie .

ziesemer
źródło
3
Niezły hack zerowy :)
Grodriguez
1
Możesz użyć tej samej techniki dla większych wartości. Jeśli chcesz dopełnić maksymalnie 2-bajtowe wartości, możesz zrobić Integer.toHexString (0x10000 | value) .substring (1). W przypadku N cyfr szesnastkowych należy dodać N 0 po „1”. Oczywiście twoja wartość szesnastkowa nie może mieć więcej niż N cyfr.
user823981
28
String.format("%02X", (0xFF & value));    
aristar
źródło
7
Czy ktoś może wyjaśnić, dlaczego to działa trochę mądrze i z 0xFF? Dlatego odpowiedzi na SO nie powinny być tylko kodem
Stealth Rabbi
4
OxFF & (bajt) wartość po prostu konwertuje bajt ze znakiem na bez znaku. (int) -1 = 0xFFFFFFFF, (int) (- 1 & 0xFf) = 0xFF
aristar
W tym przypadku bit-mądry i 0xFF nie jest konieczny ze względu na format „% 02X”.
Freek de Bruijn
1
Specyfikator% 02X określa co najmniej dwie cyfry. Jeśli chcesz mieć dokładnie dwie cyfry (odrzucając wyższe bity), potrzebujesz bitowego i.
plugwash
Dobrze wiedzieć, dziękuję za dodatkowe informacje!
tryp
14

Użyj Integer.toHexString(). Nie zapomnij uzupełnić początkowego zera, jeśli otrzymasz tylko jedną cyfrę. Jeśli Twoja liczba całkowita jest większa niż 255, otrzymasz więcej niż 2 cyfry.

StringBuilder sb = new StringBuilder();
sb.append(Integer.toHexString(myInt));
if (sb.length() < 2) {
    sb.insert(0, '0'); // pad with leading zero if needed
}
String hex = sb.toString();
Asaf
źródło
2
Czy użycie StringBuilderrzeczywiście jest poprawą? pastebin.com/KyS06JMz
właśnie czytam
4

Jeśli chcesz je tylko wydrukować, spróbuj tego:

for(int a = 0; a < 255; a++){
    if( a % 16 == 0){
        System.out.println();
    }
    System.out.printf("%02x ", a);
}
java4loop
źródło
1

Używam tego, aby uzyskać ciąg reprezentujący równoważną wartość szesnastkową liczby całkowitej oddzielonej spacją dla każdego bajtu EX: wartość szesnastkowa 260 na 4 bajty = 00 00 01 04

    public static String getHexValString(Integer val, int bytePercision){
    StringBuilder sb = new StringBuilder();
    sb.append(Integer.toHexString(val));

    while(sb.length() < bytePercision*2){
        sb.insert(0,'0');// pad with leading zero
    }

    int l = sb.length(); // total string length before spaces
    int r = l/2; //num of rquired iterations

    for (int i=1; i < r;  i++){
        int x = l-(2*i); //space postion
        sb.insert(x, ' ');
    }
    return sb.toString().toUpperCase();         
}

public static void main(String []args){
    System.out.println("hex val of 260 in 4 bytes = " + getHexValString(260,4));
}
Mohamed Abd El Raouf
źródło
0

Według GabrielOshiro, jeśli chcesz sformatować liczbę całkowitą do długości 8, spróbuj tego

String.format("0x%08X", 20) //print 0x00000014
Victor Choy
źródło