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プロジェクトにあります。