Это не только для расчета долготы и широты.Учитывая, что у вас есть 8 байтов для работы с вашими примерами, вам нужно преобразовать байтовый массив в значения с плавающей запятой двойной точности.Процесс одинаков для всех трех примеров.
Чтобы найти значение с плавающей запятой, вам нужно иметь дело с байтовым массивом на уровне битов.Объяснение процесса здесь .Или посмотрите Википедия .
Чтобы начать, в первом примере вы будете иметь дело с байтами порядка 40, 48, 98, 5D и так далее.Разбивая первые два байта 40 и 48 (0100 0000 0100 1000), у вас достаточно информации, чтобы получить знаковый бит (0) и диапазон битов экспоненты (100 0000 0100 -> 1028).Далее продолжите перечисление 52 оставшихся бит, чтобы определить дробную часть числа.Если вы будете следовать вычислениям по ссылкам выше, вы увидите значения с плавающей запятой, которые вы ожидаете от своих примеров.
В качестве примечания, некоторые языки программирования предоставляют метод для выполнения этого преобразования.В зависимости от того, какой язык вы используете, здесь не нужно заново изобретать колесо.
РЕДАКТИРОВАТЬ: Пример
Чтобы преобразовать массив байтов в число с плавающей запятой двойной точностизначение, нам потребуется три части информации из байтового массива: знаковый бит (S) , показатель (E) и дробь (F) ,Первое, что нужно сделать, это создать 64-битное представление массива из 8 байтов.Как я уже упоминал выше, вы будете использовать байты в «обратном» порядке (little-endian, если вы хотите читать по теме).Я буду использовать только первые четыре байта, так как их будет достаточно для иллюстрации процесса.
40 48 98 5D ==> 01000000 01001000 10011000 01011101
Я буду ссылаться на приведенные выше биты всамый левый порядок 0.
Знаковый бит: Это 0-й бит в приведенном выше массиве.В этом случае S равно 0. Знаковый бит - это именно то, что вы думаете, он определяет, будет ли результат с плавающей запятой отрицательным или положительным.
Показатель степени: Биты 1-11 определяют показатель степени.В этом примере показатель степени E равен 100 0000 0100 ==> 1028.
Fraction: Остальные биты 12-63 определяют дробь.Я только проиллюстрировал биты 12-31, чтобы показать, как работает процесс: 1000 10011000 01011101 ....
Дробные биты не преобразуются в десятичное значение.Вместо этого вам нужно перебирать их, обращая внимание на установленные биты (1, а не 0).Здесь важен индекс битов.Рассмотрим дробные биты, индексированные начиная с 1, увеличивая слева направо до 20. Опять же, в полном примере (биты 12-63) это индексирование будет от 1 до 52.
Дробь определяется путем суммирования каждогоя установил бит, используя это выражение: 2 ^ -i.Для данного примера это означает, что мы имеем дело с индексами 1,5,8,9,14,16,17,18,20.
Первые четыре индекса дадут нам достаточно точности для целей примера:
F = (2 ^ -1) + (2 ^ -5) +(2 ^ -8) + (2 ^ -9) + ... = 0,5 + 0,03125 + 0,00390625 + 0,001953125 = 0,537109375
Окончательное значение V находится с помощью формулы:
V = -1 ^ S * 2 ^ (E-1023) * (1 + F) = -1 ^ 0 + 2 ^ (1028-1023) * 1,537109375 = 49,1875
Это хорошее приближение к вашей цели 49,1903648.Если вы продолжите использовать полный битовый диапазон, как я вам показал, ваше окончательное значение будет совпадать.
Наконец, поскольку вы упомянули, что используете Java, вы взглянули на использование ByteBuffer
класс и getDouble
функция здесь ?