Преобразование 8 байтов двоичного кода little-endian в float с двойной точностью
У меня есть двоичный файл, который я читал byte by byte.
Я сталкиваюсь с разделом длиной 8 байт, с плавающей точкой с двойной точностью (малое число). Я не могу понять, как это прочитать и правильно рассчитать с помощью маскировки и/или кастинга.
(Чтобы быть конкретным, тип файла -.LAS, но это не имеет значения).
Есть ли какие-либо трюки Java?
Ответы
Ответ 1
Вы можете использовать ByteBuffer
из byte[] bytes
double d = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN ).getDouble();
из Socket
ByteBuffer bb = ByteBuffer.allocate(64*1024).order(ByteOrder.LITTLE_ENDIAN );
socket.read(bb);
bb.flip();
double d = bb.getDouble();
Ответ 2
Здесь описываются два разных подхода: http://bytes.com/topic/java/answers/18253-big-endian-vs-little-endian-data. Оба будут работать.
Ответ 3
Если вам нужно прочитать и поменять порядок байтов, есть EndianUtils из Commons IO:
http://commons.apache.org/io/api-release/org/apache/commons/io/EndianUtils.html
Ответ 4
- Преобразовать с маленького конца на большой endian.
- Оберните преобразованные байты в
ByteBufferInputStream
.
- Получите номер двойной точности с помощью
DataInputStream.readDouble(in)
.
В качестве альтернативы вы можете просто взять тело метода readDouble
из источника JDK и пропустить шаги 2 и 3.
Ответ 5
Просто используйте DataInputStream
, чтобы прочитать файл, и используйте метод readDouble()
.