Pretvorite float u bajtni niz na Javi

1. Pregled

U ovom brzom uputstvu istražit ćemo nekoliko primjera korištenja Jave za pretvaranje float-a u bajt-niz i obrnuto.

To je jednostavno ako int ili long pretvorimo u bajtni niz jer Java bitni operateri rade samo na cjelobrojnim vrstama. Međutim, za plovak moramo koristiti drugi sloj pretvorbe.

Na primjer, možemo koristiti API-je koje pruža Plovak razred ili ByteBuffer razred java.nio paket.

2. Konverzija plutajućeg u bajtni niz

Kao što znamo, veličina plutajućeg slova u Javi je 32 bitna što je slično int. Tako da možemo koristiti floatToIntBits ili floatToRawIntBits funkcije dostupne u Plutati klasa Java. A zatim pomaknite bitove da biste vratili bajtni niz. Kliknite ovdje da biste saznali više o operacijama prebacivanja bitova.

Razlika između oba je floatToRawIntBits čuva i vrijednosti bez broja (NaN). Ovdje je pomicanje bitova izvedeno tehnikom zvanom Sužavanje primitivne konverzije.

Prvo pogledajmo kod s funkcijom klase Float:

javni statički bajt [] floatToByteArray (plutajuća vrijednost) {int intBits = Float.floatToIntBits (vrijednost); vrati novi bajt [] {(bajt) (intBits >> 24), (bajt) (intBits >> 16), (bajt) (intBits >> 8), (bajt) (intBits)}; }

Drugo, uredan način pretvorbe pomoću ByteBuffer:

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

3. Byte Array to Float Conversion

Pretvorimo sada bajtni niz u float pomoću Plutati funkcija klase intBitsToFloat.

Međutim, prvo moramo pretvoriti bajtni niz u int bitove pomoću lijevog pomaka:

javni statički float byteArrayToFloat (bajt [] bajta) (bajta [1] & 0xFF) << 16 

Pretvaranje bajt polja u float pomoću ByteBuffer je jednostavno kao ovo:

ByteBuffer.wrap (bajtovi) .getFloat (); 

4. Jedinstveno testiranje

Pogledajmo jednostavne jedinice test slučajeva za implementaciju:

javna praznina givenAFloat_thenConvertToByteArray () {assertArrayEquals (novi bajt [] {63, -116, -52, -51}, floatToByteArray (1.1f)); } @Test javna praznina danaAByteArray_thenConvertToFloat () {assertEquals (1.1f, byteArrayToFloat (novi bajt [] {63, -116, -52, -51}), 0); }

5. Zaključak

Vidjeli smo različite načine pretvaranja plutajućih u bajtove i obrnuto.

Plutati klasa pruža funkcije kao rješenje za takvu pretvorbu. Međutim, ByteBuffer pruža uredan način za to. Iz tog razloga predlažem da ga koristite gdje god je to moguće.

Kompletni izvorni kod ovih implementacija i primjeri jediničnih testova mogu se naći u projektu GitHub.