Имя: Пароль:
1C
1С v8
Получение значений координат из шестнадцатеричного формата
0 EvgKolivagin
 
20.09.21
15:04
Приветствую,
помогите с конвертацией из шестнадцатеричного формата в координаты.

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

Хотелось бы понять по какому алгоритму это можно сделать...
1 1Сергей
 
20.09.21
15:10
Гуглить не пробовали?
2 EvgKolivagin
 
20.09.21
15:14
(1) Пробовал, нашел примеры, но не никак не могу понять суть
3 Малыш Джон
 
20.09.21
15:15
(2) значит надо пробовать ещё раз. А потом ещё. И так пока не получится
4 1Сергей
 
20.09.21
15:19
Откуда получены координаты в шестнадцатиричном формате?
5 EvgKolivagin
 
20.09.21
15:21
(4) Конкретно эти из описания протокола взаимодействия WialonRetranslator 1.0, там есть пример входящего пакета
6 EvgKolivagin
 
20.09.21
15:22
Вот пакет целиком
74000000333533393736303133343435343835004B0BFB70000000030BBB000000270102706F73696E6
66F00A027AFDF5D9848403AC7253383DD4B400000000000805A40003601460B0BBB000000120004707
7725F657874002B8716D9CE973B400BBB00000011010361766C5F696E707574730000000001
7 acht
 
20.09.21
15:24
(0) Согласно описанию протокола, это double. 8 байт.
8 EvgKolivagin
 
20.09.21
15:26
(7) Да, только как преобразовать? Тут я и застрял...
9 acht
 
20.09.21
15:28
(8) https://gregstoll.dyndns.org/~gregstoll/floattohex/
Надо установить флаг "Swap endianness"
10 acht
 
20.09.21
15:29
Это прям первое, что поиск выдал
11 acht
 
20.09.21
15:30
12 acht
 
20.09.21
15:33
13 EvgKolivagin
 
20.09.21
15:34
(9) Я находил этот калькулятор, но когда я подставляю в строку HEX значение A027AFDF5D984840, то получаю 3.1343, а не 49.1903648 как в примере
14 acht
 
20.09.21
15:35
(13) Еще раз.
Надо установить флаг "Swap endianness"
15 EvgKolivagin
 
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
нужно байты развернуть
17 EvgKolivagin
 
20.09.21
15:39
Еще я нашел обсуждение такой же проблемы, там есть такая фраза о координатах measured in degrees with a 1x10^-7 degree lsb, signed 2’s complement.
18 acht
 
20.09.21
15:40
(15) У тебя другой инернет какой-то.
https://ibb.co/KxZL90j
Прям по битам расписано
19 Ёпрст
 
20.09.21
15:40
20 EvgKolivagin
 
20.09.21
15:43
(18) (19) Извените ребят, я чет ослеп уже под конец дня, да все правильно
21 Kassern
 
20.09.21
15:44
(19) ТС видимо про это) https://ibb.co/dPnQ6y2
22 EvgKolivagin
 
20.09.21
15:44
(21) Да(
23 EvgKolivagin
 
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"));
КонецПроцедуры

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