简体   繁体   English

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

[英]How to convert a float into a byte array and vice versa?

I am trying to convert a float into a primitive byte[] and vice versa: 我试图将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)
    };
}

Oddly enough, when I try to shift the newly allocated byte[] back into a float , the result is nothing but rubbish. 奇怪的是,当我尝试将新分配的byte[]移回float ,结果只不过是垃圾。

However, it would appear as if the same algorithm works just fine when I use the primitive long data type as argument instead. 但是,当我使用原始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)
    };
}

Use these instead. 请改用它们。

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

Just to add another useful one based on @shazin solution. 只是为了添加另一个基于@shazin解决方案的实用工具。 Convert a float array into a byte array: 将float数组转换为字节数组:

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

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

    return buffer.array();
}

It wont work. 它不会工作。 Float.byteValue just truncates float value to 1 byte Float.byteValue只是将浮点值截断为1个字节

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

Besides, it's not clear what bytes you want. 此外,还不清楚你想要的字节数。 Is it IEEE 754 floating-point single-float bit layout? 它是IEEE 754浮点单浮点位布局吗? Then you can first convert it to int 然后你可以先将它转换为int

int i =  Float.floatToIntBits(1.1f);   // see Float API, there are actually 2 options

then use shifts to break it into 4 bytes or 8 bytes like you did 然后使用shift将其分解为4个字节或8个字节,就像你一样

Also based on Shazin solution, with additional specification on byte order: 同样基于Shazin解决方案,还有关于字节顺序的附加规范:

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

or 要么

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

I cant see easy-to-use methods. 我看不到易于使用的方法。 It works: 有用:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM