Kompletny przewodnik dotyczący pracy z niepodpisanymi bajtami w Javie:
(Źródło tej odpowiedzi.)
Język Java nie zapewnia unsigned
słowa kluczowego. A byte
zgodnie ze specyfikacją języka reprezentuje wartość z zakresu od –128 do 127. Na przykład, jeśli byte
rzutuje się na int
Javę, interpretuje pierwszy bit jako znak i używa rozszerzenia znaku .
To powiedziawszy, nic nie stoi na przeszkodzie, abyś zobaczył byte
po prostu 8 bitów i zinterpretował te bity jako wartość od 0 do 255. Pamiętaj tylko, że nic nie możesz zrobić, aby zmusić swoją interpretację do użycia metody innej osoby. Jeśli metoda przyjmuje wartość a byte
, wówczas metoda ta przyjmuje wartość z zakresu od –128 do 127, chyba że wyraźnie zaznaczono inaczej.
Oto kilka przydatnych konwersji / manipulacji dla Twojej wygody:
Konwersje do / z int
// From int to unsigned byte
int i = 200; // some value between 0 and 255
byte b = (byte) i; // 8 bits representing that value
// From unsigned byte to int
byte b = 123; // 8 bits representing a value between 0 and 255
int i = b & 0xFF; // an int representing the same value
(Lub, jeśli korzystasz z Java 8+, użyj Byte.toUnsignedInt
.)
Analiza / formatowanie
Najlepszym sposobem jest użycie powyższych konwersji:
// Parse an unsigned byte
byte b = (byte) Integer.parseInt("200");
// Print an unsigned byte
System.out.println("Value of my unsigned byte: " + (b & 0xFF));
Arytmetyka
Reprezentacja z 2 uzupełnieniami „po prostu działa” na dodawanie, odejmowanie i mnożenie:
// two unsigned bytes
byte b1 = (byte) 200;
byte b2 = (byte) 15;
byte sum = (byte) (b1 + b2); // 215
byte diff = (byte) (b1 - b2); // 185
byte prod = (byte) (b2 * b2); // 225
Podział wymaga ręcznej konwersji argumentów:
byte ratio = (byte) ((b1 & 0xFF) / (b2 & 0xFF));