byte[] toByteArray(int value) {
return ByteBuffer.allocate(4).putInt(value).array();
}
byte[] toByteArray(int value) {
return new byte[] {
(byte)(value >> 24),
(byte)(value >> 16),
(byte)(value >> 8),
(byte)value };
}
int fromByteArray(byte[] bytes) {
return ByteBuffer.wrap(bytes).getInt();
}
int fromByteArray(byte[] bytes) {
return bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF);
}
int fromByteArray(byte[] bytes) {
return ((bytes[0] & 0xFF) << 24) |
((bytes[1] & 0xFF) << 16) |
((bytes[2] & 0xFF) << 8 ) |
((bytes[3] & 0xFF) << 0 );
}
Saat mengemas byte yang ditandatangani ke dalam int, setiap byte perlu ditutup-tutupi karena itu diperpanjang tanda menjadi 32 bit (bukan diperpanjang nol) karena aturan promosi aritmatika (dijelaskan dalam JLS, Konversi, dan Promosi).
Ada teka-teki menarik terkait hal ini yang dijelaskan dalam Java Puzzlers ("A Big Delight in Every Byte") oleh Joshua Bloch dan Neal Gafter. Ketika membandingkan nilai byte dengan nilai int, byte tanda diperpanjang ke int dan kemudian nilai ini dibandingkan dengan int lainnya.
byte[] bytes = (…)
if (bytes[0] == 0xFF) {
}
Perhatikan bahwa semua tipe numerik ditandatangani di Java dengan pengecualian char sebagai tipe integer 16-bit unsigned.