Преобразование 8 байтов двоичного кода с прямым порядком байтов в число с плавающей запятой двойной точности - PullRequest
12 голосов
/ 24 июня 2011

У меня есть двоичный файл, который я читаю побайтно.

Я натолкнулся на секцию длиной 8 байт с плавающей запятой двойной точности (little-endian). Я не могу понять, как это прочитать и правильно рассчитать с помощью маскировки и / или приведения.

(Если быть точным, тип файла .LAS, но это не должно иметь значения).

Есть ли какие-нибудь трюки с Java?

Ответы [ 5 ]

20 голосов
/ 24 июня 2011

Вы можете использовать ByteBuffer

от byte[] bytes

 double d = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN ).getDouble();

из розетки

 ByteBuffer bb = ByteBuffer.allocate(64*1024).order(ByteOrder.LITTLE_ENDIAN );
 socket.read(bb);
 bb.flip();
 double d = bb.getDouble();
1 голос
/ 24 июня 2011
  1. Преобразование из порядкового номера в старший.
  2. Оберните конвертированные байты в ByteBufferInputStream использовании.
  3. Получите ваш номер двойной точности через DataInputStream.readDouble(in).

Кроме того, вы можете просто взять тело метода readDouble из источника JDK и пропустить шаги 2 и 3.

1 голос
/ 24 июня 2011

Если вам нужно прочитать и поменять порядок байтов, есть EndianUtils от Commons IO:

https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/EndianUtils.html

1 голос
/ 24 июня 2011

Здесь описаны два разных подхода: http://bytes.com/topic/java/answers/18253-big-endian-vs-little-endian-data. Оба будут работать.

0 голосов
/ 24 июня 2011

Просто используйте DataInputStream для чтения файла и используйте метод readDouble().

...