получение неправильных значений при чтении Double из двоичного файла в Java

#java #double #binaryfiles

#java #double #двоичные файлы

Вопрос:

 RandomAccessFile in = new RandomAccessFile("BOT.grd", "r");
in.seek(28);
double xll=in.readDouble();
  

Приведенный выше код я использую для чтения двойных данных, которые присутствуют в местоположении от 29 до 36 байт.Присутствующее значение равно 500, но я получаю 2.088E-317

Комментарии:

1. Что-то не так либо в коде, считывающем файл, либо в коде, записывающем файл. Это все, что мы можем сказать без дополнительных подробностей / кода / примеров. Пожалуйста, смотрите tinyurl.com/so-hints

2. Создайте SSCCE

3. Выстрел в темноте: чтение с плавающей точкой вместо удвоения?

4. Можете ли вы дать более подробную информацию о том, как вы читаете и записываете файл? Учитывая, что вы используете RandomAccessFile , я предполагаю, что вы не используете сериализацию. Итак, как вы записываете, а затем считываете данные? Как насчет фрагмента кода для каждого?

5. Я привел свой код выше. Я не смог прочитать двойные значения, он отлично работает с целочисленными значениями

Ответ №1:

Кажется, что этот файл хранится в другом конечном порядке, чем тот, который использует Java. Байты, вероятно, необходимо поменять местами перед преобразованием в double, вы можете попробовать следующий код для чтения значения:

 long   l = in.readLong();
double d = Double.longBitsToDouble(Long.reverseBytes(l));
  

Вот пример, иллюстрирующий проблему:

 double d = 500.0;

long l1 = Double.doubleToLongBits(d);
long l2 = Long.reverseBytes(l1);

System.out.println(Double.longBitsToDouble(l1));
System.out.println(Double.longBitsToDouble(l2));
  

Вывод:

 500.0
2.088356E-317
  

Комментарии:

1. @raviteja это все еще не работает для вас? Если это так, нам понадобится дополнительная информация или примеры этого формата файла. Но поскольку вы приняли этот ответ, я бы предположил, что это решило вашу проблему.