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();
}
// packing an array of 4 bytes to an int, big endian, minimal parentheses
// operator precedence: <<, &, |
// when operators of equal precedence (here bitwise OR) appear in the same expression, they are evaluated from left to right
int fromByteArray(byte[] bytes) {
return bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF);
}
// packing an array of 4 bytes to an int, big endian, clean code
int fromByteArray(byte[] bytes) {
return ((bytes[0] & 0xFF) << 24) |
((bytes[1] & 0xFF) << 16) |
((bytes[2] & 0xFF) << 8 ) |
((bytes[3] & 0xFF) << 0 );
}
Khi đóng gói các byte đã ký vào một int, mỗi byte cần được che đi vì nó được mở rộng ký hiệu thành 32 bit (chứ không phải mở rộng bằng 0) do quy tắc quảng cáo số học (được mô tả trong JLS, Chuyển đổi và Khuyến mãi).
Có một câu đố thú vị liên quan đến điều này được mô tả trong Java Puzzlers ("A Big Delight in Every Byte") của Joshua Bloch và Neal Gafter. Khi so sánh giá trị byte với giá trị int, byte được mở rộng đăng nhập thành int và sau đó giá trị này được so sánh với giá trị int khác
byte[] bytes = (…)
if (bytes[0] == 0xFF) {
// dead code, bytes[0] is in the range [-128,127] and thus never equal to 255
}
Lưu ý rằng tất cả các loại số được ký trong Java ngoại trừ char là loại số nguyên không dấu 16 bit.