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 );
}
İmzalı baytları int olarak paketlerken, her baytın maskelenmesi gerekir, çünkü aritmetik yükseltme kuralı (JLS, Dönüşümler ve Promosyonlar bölümünde açıklanmıştır) nedeniyle 32 bite (sıfır genişletilmiş yerine) işarete genişletilir.
Bununla ilgili ilginç bir yapboz Joshua Bloch ve Neal Gafter tarafından Java Puzzlers'da ("Her Baytta Büyük Bir Zevk") açıklanmıştır. Bir bayt değeri bir int değeriyle karşılaştırılırken, bayt bir int'e genişletilir ve sonra bu değer diğer int ile karşılaştırılır
byte[] bytes = (…)
if (bytes[0] == 0xFF) {
// dead code, bytes[0] is in the range [-128,127] and thus never equal to 255
}
Tüm sayısal türlerin, 16 bit işaretsiz tam sayı türü olan char dışında Java'da imzalandığını unutmayın.