Подтвердить что ты не робот

Преобразование float в массив байтов и наоборот в Java

Я пытаюсь преобразовать float в массив байтов. Вот способ:

 public static byte [] float2ByteArray (float value)
 {  

    Float f = new Float(value);
     return new byte [] { (byte) (f.byteValue() >>> 56),
             (byte) (f.byteValue() >>> 48),
             (byte) (f.byteValue() >>> 40),
             (byte) (f.byteValue() >>> 32),
             (byte) (f.byteValue() >>> 24),
             (byte) (f.byteValue() >>> 16),
             (byte) (f.byteValue() >>> 8),
             (byte) f.byteValue() };
 }

Исключением, которое я получаю, является: Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Float

Использование примитивного типа в long работает, но не примитивный тип для float:

public static byte [] long2ByteArray (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 };
   }
4b9b3361

Ответ 1

Используйте их вместо этого.

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

Просто добавьте еще один полезный вариант на основе решения @shazin:

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

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

        return buffer.array();
    }

Ответ 3

Это не сработает. 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 байтов, как вы делали

Ответ 4

Также на основе решения Шазина с дополнительной спецификацией по порядку байта:

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

или

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

Ответ 5

Я не вижу простых в использовании методов. Он работает:

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