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 );
}
जब हस्ताक्षरित बाइट्स को एक इंट में पैक किया जाता है, तो प्रत्येक बाइट को बंद करने की आवश्यकता होती है क्योंकि अंकगणित पदोन्नति नियम (जेएलएस, रूपांतरण और प्रचार में वर्णित) के कारण यह 32 बिट्स (शून्य-विस्तारित की तुलना में) पर हस्ताक्षरित है।
जोशुआ बलोच और नील गेयर द्वारा जावा पूज़लर्स ("ए बिग डिलाइट इन ए बाइट") में वर्णित इस से संबंधित एक दिलचस्प पहेली है। जब एक बाइट मान की इंट मान से तुलना की जाती है, तो बाइट को एक इंट में बढ़ाया जाता है और फिर इस मूल्य की तुलना दूसरे इंट से की जाती है
byte[] bytes = (…)
if (bytes[0] == 0xFF) {
// dead code, bytes[0] is in the range [-128,127] and thus never equal to 255
}
ध्यान दें कि जावा में 16-बिट अहस्ताक्षरित पूर्णांक प्रकार के अपवाद के साथ सभी संख्यात्मक प्रकारों पर हस्ताक्षर किए जाते हैं।