1. Обзор
В этом кратком руководстве мы рассмотрим несколько примеров использования Java для преобразования float в массив байтов и наоборот.
Это просто, если мы преобразуем int или along в массив байтов, поскольку побитовые операторы Java работают только с целочисленными типами. Однако для поплавка нам нужно использовать другой уровень преобразования.
Например, мы можем использовать API, предоставляемые классом Float или классом ByteBuffer пакета java.nio|/.
2. Преобразование массива с плавающей точкой в байтовый массив
Как мы знаем, размер поплавка в Java составляет 32 бита, что похоже на int. Таким образом, мы можем использовать floatToIntBits или floatToRawIntBits функции, доступные в классе Float Java. А затем сдвиньте биты, чтобы вернуть массив байтов. Нажмите здесь , чтобы узнать больше об операциях сдвига битов.
Разница между ними заключается в том, что floatToRawIntBits также сохраняет значения Not-a-Number (NaN). Здесь смещение битов было сделано с помощью метода, называемого Сужением примитивного преобразования .
Во-первых, давайте посмотрим на код с функцией класса Float:
public static byte[] floatToByteArray(float value) { int intBits = Float.floatToIntBits(value); return new byte[] { (byte) (intBits >> 24), (byte) (intBits >> 16), (byte) (intBits >> 8), (byte) (intBits) }; }
Во-вторых, аккуратный способ преобразования с использованием ByteBuffer :
ByteBuffer.allocate(4).putFloat(value).array();
3. Преобразование массива байтов в плавающий
Теперь давайте преобразуем массив байтов в float с помощью функции Float class intBitsToFloat .
Однако сначала нам нужно преобразовать массив байтов в биты int, используя сдвиг влево:
public static float byteArrayToFloat(byte[] bytes) { int intBits = bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF); return Float.intBitsToFloat(intBits); }
Преобразование массива байтов в float с помощью ByteBuffer так же просто, как это:
ByteBuffer.wrap(bytes).getFloat();
4. Модульное тестирование
Давайте рассмотрим простые примеры модульных тестов для реализации:
public void givenAFloat_thenConvertToByteArray() { assertArrayEquals(new byte[] { 63, -116, -52, -51}, floatToByteArray(1.1f)); } @Test public void givenAByteArray_thenConvertToFloat() { assertEquals(1.1f, byteArrayToFloat(new byte[] { 63, -116, -52, -51}), 0); }
5. Заключение
Мы видели различные способы преобразования float в байт и наоборот.
Класс Float предоставляет функции в качестве обходного пути для такого преобразования. Однако ByteBuffer предоставляет простой способ сделать это. По этой причине я предлагаю использовать его везде, где это возможно.
Полный исходный код этих реализаций и модульных тестов можно найти в проекте GitHub .