Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2012, 15:19   #1
Skail
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 18
По умолчанию Перевести 4-х байтное число из 16-го числа в дробное десятичное

Привет всем, нужен совет. Как перевести 8 байтное число из 16-ричной системы в дробное десятичное это мы умеем и знаем
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
d8: array [0..7] of byte = ($A0,$27,$AF,$DF,$5D,$98,$48,$40);
var
D:double;
begin
  D:=Double(d8);
  showmessage(floattostr(D));
end;
A027AFDF5D984840 из него получаем 49.1903648

а как перевести 4-х байтное число, допустим 3F6971E4.
d8: array [0..3] of byte = ($3F,$69,$71,$E4);
Skail вне форума Ответить с цитированием
Старый 15.07.2012, 16:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Single(d8) поможет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2012, 06:47   #3
Skail
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 18
По умолчанию

Все равно не получается, по примеру должно быть 3F7A09AC = 106.4962476
и 3FDA8117 = 107.1284503, а при использовании Double(d8) и Single(d8) числа получаются очень маленькими
Skail вне форума Ответить с цитированием
Старый 16.07.2012, 07:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и 3FDA8117 = 107.1284503
А, стесняюсь спросить, тебе кто эту ересь сказал?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2012, 12:00   #5
Skail
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 18
По умолчанию

Начну из далека. Ко мне в программу поступают координаты в 16-ричной системе по протоколу: что они равны 4 байта и формат данных float, я сначала не понял, и спросил у разработчика который мне эти данные отправляет, оказалось что пакет приходит в виде E871693F 42F4E83F, где первые 4 байта широта а вторые 4 байта долгота. Оказалось что эти 4 байта необходимо читать с конца, т.е. широта 3F6971E8 долгота 3FE8F442, ну и эти данные должны быть равны приблизительно 106.4962476, как они это получают не понятно....
Skail вне форума Ответить с цитированием
Старый 16.07.2012, 12:07   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

дык вам сначало порядок байт сменить надо, потом уже переводить.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.07.2012, 12:16   #7
Skail
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 18
По умолчанию

Пепел Феникса, что ты имеешь в виду
Skail вне форума Ответить с цитированием
Старый 16.07.2012, 19:50   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Процессоры Intel (и совместимые) хранят число, начиная с младшего байта.
Код:
const d1: array [0..3] of byte = ($3F,$69,$71,$E4);
const d2: array [0..3] of byte = ($E4,$71,$69,$3F);
const d3: array [0..3] of byte = ($17,$81,$DA,$3F);
const d4: array [0..3] of byte = ($3F,$DA,$81,$17);
begin
  writeln(single(d1));
  writeln(single(d2));
  writeln(single(d3));
  writeln(single(d4));
end.
Результат:
-1.78129964082461E+0022
9.11894083023071E-0001
1.70706450939178E+0000
8.39152267043049E-0025
s-andriano вне форума Ответить с цитированием
Старый 16.07.2012, 20:17   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
что ты имеешь в виду
Он имеет ввиду что порядок байт нужно переставить с точностью да наоборот. Первый байт должен быть считан с конца.
Я к примеру тоже в одном проекте вынужден переворачивать, и делаю это так:
Код:
// Функция переворачивающая 2-х байтовое слово
Function WordToStr(w:word):String;
 begin
  Result:=chr(lo(w))+chr(hi(w));
 end;

// Функция переворачивающая 4-х байтное значение
 Function DWordToStr(w:dword):String;
 var l,h:word;  s:string[4];
 begin
   asm
    mov eax,[w]
    mov [l],ax
    shr eax,16
    mov [h],ax
   end;
   Result:=WordToStr(l)+WordToStr(h);
 end;

 // Функция для перевода Double
 function QwordToStr(d:Double):string;
 type qw=array[1..8] of byte;
 var i:integer;
 begin   Result:='';
  for i:=1 to 8 do
   Result:=Result+char(qw(d)[i]);
 end;

  // Функция для перевода Extended 80-bit
 function TWordToStr(d:Extended):string;
 type qw=array[1..10] of byte;
 var i:integer;
 begin   Result:='';
  for i:=1 to 10 do
   Result:=Result+char(qw(d)[i]);
 end;
Что правда в результате мне нужен не массив байт а строка (которая впрочим эти массивом и является)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.10.2012, 11:02   #10
Roguer
 
Аватар для Roguer
 
Регистрация: 05.10.2012
Сообщений: 4
По умолчанию

UPD: два дня мучался, в итоге как на форуме спросил, через полчаса сам все сделал) Проблема решена.
Мы все умрем

Последний раз редактировалось Roguer; 05.10.2012 в 11:47.
Roguer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевести из 16-го числа в дробное десятичное Skail Общие вопросы Delphi 3 29.04.2012 09:31
Перевести отрицатьльное дробное число в двоичную систему Иллидан Помощь студентам 0 14.11.2010 13:04
класс «дробное число» RodionL3 Общие вопросы C/C++ 5 24.04.2010 12:44
класс «дробное число»(С++) RodionL3 Помощь студентам 2 22.04.2010 21:30
Перевести целое положительное десятичное число в шестнадцатеричное счисление Alfis Паскаль, Turbo Pascal, PascalABC.NET 3 28.12.2008 20:40