Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Получение значений координат из шестнадцатеричного формата

Получение значений координат из шестнадцатеричного формата
Я
   EvgKolivagin
 
20.09.21 - 15:04
Приветствую,
помогите с конвертацией из шестнадцатеричного формата в координаты.

Пример из "A027AFDF5D984840" должно получиться "49.1903648"

Хотелось бы понять по какому алгоритму это можно сделать...
   1Сергей
 
1 - 20.09.21 - 15:10
Гуглить не пробовали?
   EvgKolivagin
 
2 - 20.09.21 - 15:14
(1) Пробовал, нашел примеры, но не никак не могу понять суть
   Малыш Джон
 
3 - 20.09.21 - 15:15
(2) значит надо пробовать ещё раз. А потом ещё. И так пока не получится
   1Сергей
 
4 - 20.09.21 - 15:19
Откуда получены координаты в шестнадцатиричном формате?
   EvgKolivagin
 
5 - 20.09.21 - 15:21
(4) Конкретно эти из описания протокола взаимодействия WialonRetranslator 1.0, там есть пример входящего пакета
   EvgKolivagin
 
6 - 20.09.21 - 15:22
Вот пакет целиком
74000000333533393736303133343435343835004B0BFB70000000030BBB000000270102706F73696E6
66F00A027AFDF5D9848403AC7253383DD4B400000000000805A40003601460B0BBB000000120004707
7725F657874002B8716D9CE973B400BBB00000011010361766C5F696E707574730000000001
   acht
 
7 - 20.09.21 - 15:24
(0) Согласно описанию протокола, это double. 8 байт.
   EvgKolivagin
 
8 - 20.09.21 - 15:26
(7) Да, только как преобразовать? Тут я и застрял...
   acht
 
9 - 20.09.21 - 15:28
(8) https://gregstoll.dyndns.org/~gregstoll/floattohex/
Надо установить флаг "Swap endianness"
   acht
 
10 - 20.09.21 - 15:29
Это прям первое, что поиск выдал
   acht
 
11 - 20.09.21 - 15:30
   acht
 
12 - 20.09.21 - 15:33
   EvgKolivagin
 
13 - 20.09.21 - 15:34
(9) Я находил этот калькулятор, но когда я подставляю в строку HEX значение A027AFDF5D984840, то получаю 3.1343, а не 49.1903648 как в примере
   acht
 
14 - 20.09.21 - 15:35
(13) Еще раз.
Надо установить флаг "Swap endianness"
   EvgKolivagin
 
15 - 20.09.21 - 15:36
(14) Я установил, у меня показывает 3.1343
   Кирпич
 
16 - 20.09.21 - 15:39
var
  d : double;
  p : PInt64;
begin
  p := @d;
  p^ := $4048985DDFAF27A0;//перевернутое A027AFDF5D984840

  ShowMessage(d.ToString);
end;

вот так дает 49.1903648
нужно байты развернуть
   EvgKolivagin
 
17 - 20.09.21 - 15:39
Еще я нашел обсуждение такой же проблемы, там есть такая фраза о координатах measured in degrees with a 1x10^-7 degree lsb, signed 2’s complement.
   acht
 
18 - 20.09.21 - 15:40
(15) У тебя другой инернет какой-то.
https://ibb.co/KxZL90j
Прям по битам расписано
   Ёпрст
 
19 - 20.09.21 - 15:40
   EvgKolivagin
 
20 - 20.09.21 - 15:43
(18) (19) Извените ребят, я чет ослеп уже под конец дня, да все правильно
   Kassern
 
21 - 20.09.21 - 15:44
(19) ТС видимо про это) https://ibb.co/dPnQ6y2
   EvgKolivagin
 
22 - 20.09.21 - 15:44
(21) Да(
   EvgKolivagin
 
23 - 20.09.21 - 15:46
Спасибо всем кто принял участие в обсуждении, очень мне помогли.
   Кирпич
 
24 - 21.09.21 - 22:06
Вот. Прямо с дивана
&НаКлиенте
Функция ДесятичноеВДвоичное(Знач ИсхЧисло, Знаков) Экспорт 
    ДвоичныйКод = "";
    Для а=1 по Знаков Цикл
        Если ИсхЧисло <> 0 Тогда
            ДвоичныйКод = "" + ИсхЧисло%2 + ДвоичныйКод ;
            ИсхЧисло = Цел(ИсхЧисло/2);
        Иначе
            ДвоичныйКод = "0" + ДвоичныйКод ;
        КонецЕсли;    
    КонецЦикла;
    Возврат ДвоичныйКод;   
КонецФункции 

&НаКлиенте
Функция ДвоичноеВДесятичное(Знач Стр2)     
    Стр = СокрЛП(Стр2);
    Рез=0;    
    Для н=1 по СтрДлина(Стр) Цикл
        Рез=Рез*2+Число(Сред(Стр,н,1));
    КонецЦикла;    
    Возврат Рез;    
КонецФункции   

&НаКлиенте
Функция HEX2DOUBLE(хх)
    Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки(хх);
    Ч = Буфер.ПрочитатьЦелое64(0, ПорядокБайтов.LittleEndian);
    Д = ДесятичноеВДвоичное(Ч, 8*8); 
    Знак = ?(Лев(Д,1)="1",1,0);
    Порядок = ДвоичноеВДесятичное(Сред(Д, 2, 11));
    Мантисса = ДвоичноеВДесятичное("1"+Сред(Д, 14, 51));
    Возврат Окр(Pow(-1, Знак) * Pow(2,Порядок-1023) * (1+Мантисса/Pow(2,52)),7);    
КонецФункции

&НаКлиенте
Процедура Команда1(Команда)
    Сообщить(HEX2DOUBLE("A027AFDF5D984840"));
КонецПроцедуры


   acht
 
25 - 21.09.21 - 23:13
(24) Можно обойтись без ковыряния со строками, банальными битовыми операциями с числами.
Но лениво.


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.