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.