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.


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().


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 .


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));    

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();

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);
}

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));
}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.