1. Обзор
В этом кратком руководстве мы рассмотрим несколько примеров использования Java для преобразования числа с плавающей запятой в массив байтов и наоборот.
Это просто, если мы преобразуем int или long в массив байтов, поскольку побитовые операторы 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
intBitsToFloat
.
Однако нам нужно сначала преобразовать массив байтов в целые биты, используя сдвиг влево:
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);
}
Преобразование массива байтов в число с плавающей запятой с помощью 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
предоставляет функции в качестве обходного пути для такого преобразования. Однако ByteBuffer
предоставляет удобный способ сделать это. По этой причине я предлагаю использовать его везде, где это возможно.
Полный исходный код этих реализаций и кейсов юнит-тестов можно найти в проекте GitHub .