1. 概要

このクイックチュートリアルでは、Javaを使用してfloatをバイト配列に変換する例とその逆の例をいくつか紹介します。

Javaビット演算子は整数型でのみ機能するため、intまたはlongをバイト配列に変換する場合は簡単です。 ただし、フロートの場合は、別の変換レイヤーを使用する必要があります。

たとえば、 theFloatクラスまたはjava.nioパッケージのByteBufferクラスによって提供されるAPIを使用できます。

2. フロートからバイト配列への変換

ご存知のように、Javaのfloatのサイズは32ビットで、intに似ています。 したがって、JavaのFloatクラスで使用可能なfloatToIntBitsまたはfloatToRawIntBits関数を使用できます。 次に、ビットをシフトしてバイト配列を返します。 ビットシフト操作の詳細については、こちらをクリックしてください。

両者の違いは、 floatToRawIntBits はNot-a-Number(NaN)値も保持することです。 ここでは、ビットのシフトは Narrowing PrimitiveConversionと呼ばれる手法で行われました。

まず、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 は、これを行うための優れた方法を提供します。 このため、可能な限り使用することをお勧めします。

これらの実装と単体テストケースの完全なソースコードは、GitHubプロジェクトにあります。