在Java中将浮点数转换为字节数组

2023/06/09

1. 概述

在这个快速教程中,我们将探讨一些使用Java将浮点数转换为字节数组的示例,反之亦然。

如果我们将int或long转换为字节数组,这很简单,因为Java按位运算符仅适用于整数类型。但是,对于一个浮点数,我们需要使用另一层转换。

例如,我们可以使用Float类或java.nio包的ByteBuffer类提供的API。

2. 浮点数到字节数组的转换

正如我们所知,Java中浮点数的大小是32位,类似于int。因此,我们可以使用Java的Float类中提供的floatToIntBits或floatToRawIntBits函数。然后移动位以返回字节数组。单击此处了解有关移位操作的更多信息。

两者之间的区别在于floatToRawIntBits也保留非数字(NaN)值。在这里,移动位是通过一种称为缩小原始转换的技术完成的。

首先让我们看一下使用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将字节数组转换为浮点数。

但是,我们需要先使用左移将字节数组转换为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将字节数组转换为浮点数非常简单:

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上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章