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.
@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.
Odpowiedzi:
Zobacz też
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:
Używa tu kilku odpowiedzi
Integer.toHexString(int)
; jest to wykonalne, ale z pewnymi zastrzeżeniami. Ponieważ parametrem jest anint
, wykonywana jest rozszerzająca prymitywna konwersja nabyte
argument, która obejmuje rozszerzenie znaku.8-bit
byte
, który jest podpisany w Javie, jest rozszerzony do 32-bitint
. Aby skutecznie cofnąć to rozszerzenie znaku, można zamaskować zabyte
pomocą0xFF
.Innym problemem związanym z używaniem
toHexString
jest to, że nie wpisuje zer:Oba czynniki łącznie powinny uczynić
String.format
rozwiązanie bardziej preferowanym.Bibliografia
byte
, od-128
do127
włącznieźródło
toHexString
. Musisz to maskować, to& 0xFF
znaczyInteger.toHexString(-46 & 0xFF)
jest"d2"
.byte
za& 0xFF
każdym razem maskować wartość .format
rozwiązanie powyżej mogą również wymagać maskowania w zależności od tego, czego faktycznie używając jako argumentu.