https://mkyong.com/java/java-convert-bytes-to-unsigned-bytes/
In Java, byte is an 8-bit signed (+,-) data type, it has value of Byte.MIN_VALUE
-128 to Byte.MAX_VALUE
127 (inclusive).
Java doesn’t have unsigned bytes (0 to 255). To make unsigned bytes, we can cast or widen a byte
into an int
and mask with 0xff
to avoid sign extension.
Further Reading
Sign extension
Two’s complement
1. unsigned bytes
Java 8 A new Byte.toUnsignedInt()
is introduced to convert the signed bytes into unsigned bytes.
JavaExample1.java
package com.mkyong;
public class JavaExample1 {
public static void main(String[] args) {
byte input = (byte) -2; // -2 (signed) and 254 (unsigned)
System.out.println(input); // -2
System.out.println(convertBytesToUnsignedBytes(input)); // 254
// Java 8
System.out.println(Byte.toUnsignedInt(input)); // 254
}
public static int convertBytesToUnsignedBytes(Byte x) {
// auto cast to int
return x & 0xFF;
// explicit cast
// return ((int) x) & 0xFF;
}
}
Output
-2
254
254
2. Explanation
Read comments for self-explanatory.
JavaExample2.java
package com.mkyong;
public class JavaExample2 {
public static void main(String[] args) {
byte input = (byte) -2; // -2 (signed) and 254 (unsigned)
// -2 = 1111 1110 , two's complement
System.out.println("Input : " + input);
// byte (8 bits) cast/widen to int (4 bytes, 16 bits), sign extension will apply
// 1111 1111 | 1111 1111 | 1111 1111 | 1111 1110
int input2 = (int) input;
System.out.println("Input [Binary] : " + Integer.toBinaryString(input2));
// 1111 1111 | 1111 1111 | 1111 1111 | 1111 1110
// &
// 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111 (0xFF) , get last 8 bits
// =============================================
// 0000 0000 | 0000 0000 | 0000 0000 | 1111 1110 unsigned bytes
int result = input2 & 0xff;
System.out.println(result); // 254
System.out.println(Integer.toBinaryString(result)); // 1111 1110
// Java 8
System.out.println(Byte.toUnsignedInt(input));
}
}
Output
Input : -2
Input [Binary] : 11111111111111111111111111111110
254
11111110
254
P.S Correct me if the above binary explanation is incorrect
References
Java Data Type
Java and “& 0xFF” example
Sign extension
Two’s complement
0xff
binary
bytes
java 8
sign extension
two complement
Similar Posts:
- Convert Object to List>, avoiding Unchecked cast: ‘java.lang.Object’ to ‘java.util.List
- Java – Stream has already been operated upon or closed
- [Solved] Typeerror: incorrect padding occurred in python3 Base64 decoding
- IDEA compile error: sun.misc.Base64decoder upgrade processing
- [Solved] exception is java.lang.NoClassDefFoundError: com.sun.crypto.provider.SunJCE
- signer information does not match signer information of other classes in the same package
- Solution to the problem of Java program “resource leak: ‘SC’ is never closed” in vscode
- MessagePack Error reported for deserialization of enumerated classes: Caused by: javassist.CannotCompileException: [source error] no such constructor: com.example..
- How to Solve Error: buuctf re [MRCTF2020]Xor
- AES secret key length error: java.security.InvalidKeyException: Illegal key size or default parameters [Solved]