如何将浮点数转换为字节数组,反之亦然?

19

我正在尝试将一个 float 转换为基本的 byte[],反之亦然:

public byte[] floatToByteArray(final float value)
{
    return new byte[]
    {
        (byte) (value >> 56),
        (byte) (value >> 48),
        (byte) (value >> 40),
        (byte) (value >> 32),
        (byte) (value >> 24),
        (byte) (value >> 16),
        (byte) (value >> 8),
        (byte) (value)
    };
}

奇怪的是,当我尝试将新分配的byte[]转换回float时,结果仅仅是一堆垃圾。

然而,使用基本数据类型long作为参数时,相同的算法似乎能够正常工作。

public byte[] longToByteArray(final long value)
{
    return new byte[]
    {
        (byte) (value >> 56),
        (byte) (value >> 48),
        (byte) (value >> 40),
        (byte) (value >> 32),
        (byte) (value >> 24),
        (byte) (value >> 16),
        (byte) (value >> 8),
        (byte) (value)
    };
}

你是如何测试这个函数的? - Thai Tran
你在测试数据 float2ByteArray(3.4f) 的末尾添加了 f 吗? - Thai Tran
2
我现在开始喜欢C语言了。char* floatAsByte = (char*)&myFloat; - Ryan Amos
2
浮点数是32位的,因此获取整数位 http://docs.oracle.com/javase/6/docs/api/java/lang/Float.html#floatToIntBits(float) 并使用与长整型相似的方法,但改为使用整型。 - Ryan Amos
5个回答

62

使用这些替代品。

public static byte [] long2ByteArray (long value)
{
    return ByteBuffer.allocate(8).putLong(value).array();
}

public static byte [] float2ByteArray (float value)
{  
     return ByteBuffer.allocate(4).putFloat(value).array();
}

2
请问您能否提供有关要导入的包的更多信息?我们有两个选项:Java.nio和java.sum.corba。 - Khan
2
好的,这是导入java.nio.ByteBuffer包。另一个包没有allocate函数 :D - Khan

13

只是想根据 @shazin 的解决方案添加另一个有用的内容。将浮点数组转换为字节数组:

public static byte[] FloatArray2ByteArray(float[] values){
    ByteBuffer buffer = ByteBuffer.allocate(4 * values.length);

    for (float value : values){
        buffer.putFloat(value);
    }

    return buffer.array();
}

9

基于Shazin解决方案,同时加入了有关字节顺序的额外规范:

ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putFloat(value).array();

或者

ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putFloat(value).array();

8

这不行。Float.byteValue只会将float值截断为1个字节。

  public byte byteValue() {
        return (byte)value;
    }

此外,您需要说明您需要哪些字节。是否是IEEE 754浮点单精度位布局?然后您可以先将其转换为int。
int i =  Float.floatToIntBits(1.1f);   // see Float API, there are actually 2 options

然后使用移位操作将其分成4个字节或8个字节,就像你之前做的那样。

OP想要全部8个字节,而不是其中的一个。 - Ryan Amos
但这正是他所没有理解的,他将同一个截断的字节移位了8次。 - Evgeniy Dorofeev
是的,我在你有浮点数转整数位之前就说过了,所以那时候它更相关一些。 - Ryan Amos
感谢 floatToIntBits,正是我所需要的。 - weaknespase
这是比ByteBuffer更轻量级的答案。从int到byte也有更简单的转换。 - andras

6

我看不到易于使用的方法。以下方法可行:

public static byte[] toByteArray(float value) {
    byte[] bytes = new byte[4];
    ByteBuffer.wrap(bytes).putFloat(value);
    return bytes;
}

public static float toFloat(byte[] bytes) {
    return ByteBuffer.wrap(bytes).getFloat();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接