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 );
}
Beim Packen von vorzeichenbehafteten Bytes in ein int muss jedes Byte maskiert werden, da es aufgrund der arithmetischen Heraufstufungsregel (beschrieben in JLS, Conversions and Promotions) auf 32 Bit vorzeichenerweitert (anstatt auf null erweitert) ist.
Es gibt ein interessantes Puzzle, das in Java Puzzlers ("Eine große Freude in jedem Byte") von Joshua Bloch und Neal Gafter beschrieben ist. Beim Vergleichen eines Bytewerts mit einem int-Wert wird das Byte vorzeichenerweitert zu einem int und dieser Wert wird dann mit dem anderen int verglichen
byte[] bytes = (…)
if (bytes[0] == 0xFF) {
// dead code, bytes[0] is in the range [-128,127] and thus never equal to 255
}
Beachten Sie, dass alle numerischen Typen in Java signiert sind, mit Ausnahme von char, einem 16-Bit-Integer-Typ ohne Vorzeichen.