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
int fromByteArray(byte[] bytes) {
return bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF);
}
Khi đóng gói byte ký vào một int, mỗi byte cần phải được che đậy bởi vì nó là đăng nhập mở rộng đến 32 bit (chứ không phải là zero-mở rộng) do sự cai trị khuyến mãi 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 một giá trị byte đến một giá trị int, byte là đăng nhập mở rộng đến một int và sau đó giá trị này được so sánh với int
byte[] bytes = (…)
if (bytes[0] == 0xFF) {
// dead code, bytes[0] is in the range [-128,127] and thus never equal to 255
}
Lưu ý khác mà tất cả các loại số đăng nhập Java với ngoại lệ đối với char là một loại số nguyên không dấu 16 bit.
Nguồn
2011-10-01 09:18:39
bao nhiêu * làm * bạn hiểu về chút thay đổi? Nghe có vẻ như câu hỏi thực sự là "những gì bit chuyển dịch làm" nhiều hơn về việc chuyển đổi sang mảng byte, thực sự - nếu bạn thực sự muốn hiểu cách chuyển đổi sẽ hoạt động. –
(Chỉ cần làm rõ, tôi ổn với một trong hai câu hỏi, nhưng nó có giá trị làm cho nó rõ ràng * mà * câu hỏi bạn thực sự muốn trả lời. Bạn có thể nhận được một câu trả lời đó là hữu ích hơn cho bạn theo cách đó.) –
Được rồi tôi có quan điểm của bạn! Cảm ơn nhận xét. Tôi biết những gì thay đổi chút nào tôi chỉ không hiểu những gì nó được sử dụng để chuyển đổi mảng byte được nêu ra. – Chris