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?
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?
Odpowiedzi:
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 "
java.util.Formatter składnia
%[flags][width]conversion
'0'- wynik zostanie uzupełniony zerami2'X'- wynik jest sformatowany jako liczba szesnastkowa, wielkie literyPatrzą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.
byte, od -128do 127włącznietoHexString. Musisz to maskować, to & 0xFFznaczy Integer.toHexString(-46 & 0xFF)jest "d2".
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.