Преобразование 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 };
}
Ответы
Ответ 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();
}