簡體   English   中英

如何將float轉換為字節數組,反之亦然?

[英]How to convert a float into a byte array 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)
    };
}

奇怪的是,當我嘗試將新分配的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)
    };
}

請改用它們。

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

只是為了添加另一個基於@shazin解決方案的實用工具。 將float數組轉換為字節數組:

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

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

    return buffer.array();
}

它不會工作。 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

然后使用shift將其分解為4個字節或8個字節,就像你一樣

同樣基於Shazin解決方案,還有關於字節順序的附加規范:

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

要么

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

我看不到易於使用的方法。 有用:

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