Converti un Float in un Byte Array in Java

1. Panoramica

In questo rapido tutorial, esploreremo alcuni esempi di utilizzo di Java per convertire un float in un array di byte e viceversa.

Questo è semplice se convertiamo un int o un long in un array di byte poiché Java Bitwise Operators funziona solo su tipi interi. Tuttavia, per un float, dobbiamo utilizzare un altro livello di conversione.

Ad esempio, possiamo utilizzare le API fornite dalla classe Float o dalla classe ByteBuffer del pacchetto java.nio .

2. Conversione da virgola mobile a array di byte

Come sappiamo, la dimensione di un float in Java è di 32 bit, che è simile a un int. Quindi possiamo usare le funzioni floatToIntBits o floatToRawIntBits disponibili nella classe Float di Java. Quindi sposta i bit per restituire un array di byte. Fare clic qui per saperne di più sulle operazioni di spostamento dei bit.

La differenza tra entrambi è floatToRawIntBits conserva anche i valori Not-a-Number (NaN). Qui lo spostamento dei bit è stato eseguito tramite una tecnica chiamata Narrowing Primitive Conversion.

Per prima cosa diamo un'occhiata al codice con la funzione di classe Float:

public static byte[] floatToByteArray(float value) { int intBits = Float.floatToIntBits(value); return new byte[] { (byte) (intBits >> 24), (byte) (intBits >> 16), (byte) (intBits >> 8), (byte) (intBits) }; }

In secondo luogo un modo pulito di conversione utilizzando ByteBuffer :

ByteBuffer.allocate(4).putFloat(value).array();

3. Conversione da array di byte a virgola mobile

Convertiamo ora un array di byte in un float usando la funzione della classe Float intBitsToFloat .

Tuttavia, dobbiamo prima convertire un array di byte in bit int usando lo shift sinistro:

public static float byteArrayToFloat(byte[] bytes)  (bytes[1] & 0xFF) << 16 

Convertire un array di byte in un float usando ByteBuffer è semplice come questo:

ByteBuffer.wrap(bytes).getFloat(); 

4. Test unitario

Diamo un'occhiata a semplici casi di unit test per l'implementazione:

public void givenAFloat_thenConvertToByteArray() { assertArrayEquals(new byte[] { 63, -116, -52, -51}, floatToByteArray(1.1f)); } @Test public void givenAByteArray_thenConvertToFloat() { assertEquals(1.1f, byteArrayToFloat(new byte[] { 63, -116, -52, -51}), 0); }

5. conclusione

Abbiamo visto diversi modi di conversione da float a byte e viceversa.

La classe Float fornisce funzioni come soluzione alternativa per tale conversione. Tuttavia, ByteBuffer fornisce un modo semplice per farlo. Per questo motivo, suggerisco di utilizzarlo ove possibile.

Il codice sorgente completo di queste implementazioni e casi di unit test può essere trovato nel progetto GitHub.