17

私はを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)
    };
}
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ソリューションに基づいた別の便利なものを追加するだけです。float配列をbyte配列に変換します。

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は、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

次に、Shiftsを使用して、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 に答える