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);
}
Nell'imballare byte Acceso in un int, ciascun byte deve essere mascherato perché è registrati esteso a 32 bit (anziché zero esteso) dovute alla regola promozione aritmetica (descritto in JLS, conversioni e promozioni).
C'è un interessante puzzle relativo a questo descritto in Java Puzzlers ("Una grande delizia in ogni byte") di Joshua Bloch e Neal Gafter. Quando si confrontano un valore di byte per un valore int, il byte è segno-esteso ad un int e poi questo valore viene confrontato con l'altro int
byte[] bytes = (…)
if (bytes[0] == 0xFF) {
// dead code, bytes[0] is in the range [-128,127] and thus never equal to 255
}
Si ricorda che tutti i tipi numerici sono firmati in Java con l'eccezione a char essere un tipo intero senza segno a 16 bit.
fonte
2011-10-01 09:18:39
Quanto * * fai a capire su po spostando? Sembra proprio che la domanda sia davvero "cosa fa il bit shifting" più della conversione in array di byte, in realtà - se in realtà vuoi capire come funzionerebbe la conversione. –
(Giusto per chiarire, sto bene con entrambe le domande, ma vale la pena chiarire * quale * domanda a cui vuoi veramente rispondere. Probabilmente otterrai una risposta che ti è più utile in questo modo.) –
Okay capito il tuo punto! Grazie per l'osservazione. So che bit shifting non ho ancora capito a cosa serve per la conversione di array di byte. – Chris