17

我正在尝试将 afloat转换为原语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[]回 afloat时,结果只是垃圾。

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)
    };
}
4

5 回答 5

59

改用这些。

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();
}
于 2013-01-31T06:29:09.657 回答
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();
}
于 2013-12-20T07:48:03.013 回答
8

同样基于 Shazin 解决方案,对字节顺序有额外的规范:

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

或者

ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putFloat(value).array();
于 2015-01-27T17:08:48.650 回答
6

它不会工作。Float.byteValue 只是将浮点值截断为 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 个字节

于 2013-01-31T06:31:42.637 回答
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();
}
于 2017-06-16T04:12:30.393 回答