Javaでフロートをバイト配列に変換する

1. 概要

このクイックチュートリアルでは、Javaを使用してfloatをbyte配列に、またはその逆に変換するいくつかの例を検討します。
Java Bitwise Operatorsは整数型でのみ機能するため、intまたはlongをバイト配列に変換する場合、これは簡単です。 ただし、フロートの場合は、別の変換レイヤーを使用する必要があります。
たとえば、_java.nio_パッケージの_Float_クラスまたは_ByteBuffer_クラスによって提供されるAPIを使用できます。

2. 浮動小数点からバイト配列への変換

知っているように、Javaのfloatのサイズは32ビットで、intに似ています。 したがって、Javaの_Float_クラスで使用可能な_floatToIntBitsまたはfloatToRawIntBits_関数を使用できます。 そして、ビットをシフトしてバイト配列を返します。 ビットシフト操作の詳細については、https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html [こちら]をクリックしてください。
両者の違いは、_floatToRawIntBits_は非数(NaN)値も保持することです。 ここで、ビットのシフトはhttps://docs.oracle.com/javase/specs/jls/se10/html/jls-5.html#jls-5.1.3[Narrowing Primitive Conversion]と呼ばれる手法によって行われました。
まず、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) };
}
第二に、_ByteBuffer_を使用した適切な変換方法:
ByteBuffer.allocate(4).putFloat(value).array();

3. バイト配列から浮動小数点への変換

_Float_クラス関数_intBitsToFloat_を使用して、バイト配列をfloatに変換しましょう。
ただし、最初に左シフトを使用してバイト配列をintビットに変換する必要があります。
public static float byteArrayToFloat(byte[] bytes) {
    int intBits =
      bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF);
    return Float.intBitsToFloat(intBits);
}
_ByteBuffer_を使用してバイト配列をfloatに変換するのは、これと同じくらい簡単です:
ByteBuffer.wrap(bytes).getFloat();

4. 単体テスト

実装のための簡単な単体テストケースを見てみましょう。
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. 結論

フロートからバイトへの変換、およびその逆のさまざまな方法を見てきました。
_Float_クラスは、このような変換の回避策として機能を提供します。 ただし、_ByteBuffer_はこれを行うための適切な方法を提供します。 このため、可能な限り使用することをお勧めします。
これらの実装と単体テストケースの完全なソースコードは、https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-arrays-2 [GitHubプロジェクト]にあります。