Kod Java Aby przekonwertować bajt na szesnastkowy

184

Mam tablicę bajtów. Chcę, aby każdy bajt ciągu tej tablicy został przekonwertowany na odpowiadające mu wartości szesnastkowe.

Czy w Javie jest jakaś funkcja do konwersji tablicy bajtów na format szesnastkowy?

Vivek
źródło
2
To, co nazywacie tablicą bajtów w Javie, w innych językach nazywane jest łańcuchem bajtów (np. Docs.racket-lang.org/guide/bytestrings.html )
Patrick Favre

Odpowiedzi:

311
    byte[] bytes = {-1, 0, 1, 2, 3 };
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
        sb.append(String.format("%02X ", b));
    }
    System.out.println(sb.toString());
    // prints "FF 00 01 02 03 "

Zobacz też

  • java.util.Formatter składnia
    • %[flags][width]conversion
      • Flaga '0'- wynik zostanie uzupełniony zerami
      • Szerokość 2
      • Konwersja 'X'- wynik jest sformatowany jako liczba szesnastkowa, wielkie litery

Patrząc na tekst pytania, możliwe jest również, że jest to wymagane:

    String[] arr = {"-1", "0", "10", "20" };
    for (int i = 0; i < arr.length; i++) {
        arr[i] = String.format("%02x", Byte.parseByte(arr[i]));
    }
    System.out.println(java.util.Arrays.toString(arr));
    // prints "[ff, 00, 0a, 14]"

Używa tu kilku odpowiedzi Integer.toHexString(int); jest to wykonalne, ale z pewnymi zastrzeżeniami. Ponieważ parametrem jest an int, wykonywana jest rozszerzająca prymitywna konwersja na byteargument, która obejmuje rozszerzenie znaku.

    byte b = -1;
    System.out.println(Integer.toHexString(b));
    // prints "ffffffff"

8-bit byte, który jest podpisany w Javie, jest rozszerzony do 32-bit int. Aby skutecznie cofnąć to rozszerzenie znaku, można zamaskować za bytepomocą 0xFF.

    byte b = -1;
    System.out.println(Integer.toHexString(b & 0xFF));
    // prints "ff"

Innym problemem związanym z używaniem toHexStringjest to, że nie wpisuje zer:

    byte b = 10;
    System.out.println(Integer.toHexString(b & 0xFF));
    // prints "a"

Oba czynniki łącznie powinny uczynić String.formatrozwiązanie bardziej preferowanym.

Bibliografia

środki smarujące wielotlenowe
źródło
@Vivek: co to jest „niezwykle duża wartość”? Jakie są dane wejściowe i jakie dane wyjściowe?
polygenelrycyny
Pozwól mi wyjaśnić jeszcze raz. Mam kolekcję ciągów bajtów w tablicy. Ale muszę osobno przeanalizować każdy bajt .. Nie chcę więc pracować nad całą tablicą, ale pojedynczym ciągiem bajtów na raz, to jest jeden element tej tablicy. Pomyłka powstała z powodu słowa „ szyk". Teraz w poniższym kodzie „bajt bv = 10; ciąg hexString = Integer.toHexString (bv);” CAse 1 (Byte Recieved: 68 Hex Output:: 44) Case: 2 (Byte Recieved: -46 Hex Output:: ffffffd2) ......... Dlaczego otrzymuję tak nieoczekiwany wynik dla niektórych wartości?
Vivek
1
@Vivek: przeczytaj moją odpowiedź na temat używania toHexString. Musisz to maskować, to & 0xFFznaczy Integer.toHexString(-46 & 0xFF)jest "d2".
polygenelrycyny
@polygenelubricants: Bardzo dziękuję .. Wygląda na to, że w końcu kod działa dobrze. Czy można teraz bezpiecznie korzystać z funkcji HexString? Lub może być jakieś luki w tym podejściu?
Vivek
1
@Vivek: jest „bezpieczny”, musisz tylko uważać i byteza & 0xFFkażdym razem maskować wartość . formatrozwiązanie powyżej mogą również wymagać maskowania w zależności od tego, czego faktycznie używając jako argumentu.
polygenelricricants