Convertir un flottant en tableau d'octets en Java

1. Vue d'ensemble

Dans ce rapide didacticiel, nous explorerons quelques exemples d'utilisation de Java pour convertir un flottant en tableau d'octets et vice versa.

C'est simple si nous convertissons un int ou un long en un tableau d'octets car les opérateurs Java Bitwise ne fonctionnent que sur les types entiers. Cependant, pour un flottant, nous devons utiliser une autre couche de conversion.

Par exemple, nous pouvons utiliser des API fournies par la classe Float ou la classe ByteBuffer du package java.nio .

2. Conversion de tableau flottant en octet

Comme nous le savons, la taille d'un flottant en Java est de 32 bits, ce qui est similaire à un int. Nous pouvons donc utiliser les fonctions floatToIntBits ou floatToRawIntBits disponibles dans la classe Float de Java. Et puis décalez les bits pour renvoyer un tableau d'octets. Cliquez ici pour en savoir plus sur les opérations de décalage de bits.

La différence entre les deux est que floatToRawIntBits préserve également les valeurs Not-a-Number (NaN). Ici, le décalage des bits a été effectué grâce à une technique appelée Narrowing Primitive Conversion.

Examinons d'abord le code avec la fonction de 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) }; }

Deuxièmement, une méthode intéressante de conversion en utilisant ByteBuffer :

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

3. Conversion de tableau d'octets en flottant

Convertissons maintenant un tableau d'octets en float à l'aide de la fonction de classe Float intBitsToFloat .

Cependant, nous devons d'abord convertir un tableau d'octets en bits int en utilisant le décalage à gauche:

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

La conversion d'un tableau d'octets en un float à l'aide de ByteBuffer est aussi simple que ceci:

ByteBuffer.wrap(bytes).getFloat(); 

4. Tests unitaires

Regardons des cas de test unitaires simples pour l'implémentation:

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. Conclusion

Nous avons vu différentes façons de convertir flottant en octet et vice-versa.

La classe Float fournit des fonctions comme solution de contournement pour une telle conversion. Cependant, ByteBuffer fournit une manière intéressante de le faire. Pour cette raison, je suggère de l'utiliser dans la mesure du possible.

Le code source complet de ces implémentations et cas de test unitaires se trouve dans le projet GitHub.