Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.03.2009, 10:16
Yrok Yrok вне форума
Прохожий
 
Регистрация: 04.03.2009
Сообщения: 6
Репутация: 10
По умолчанию HEX переводим в Single

Привет всем!!
Очень требуется помощь--есть прибор с которого по RS232 приходят данные "представленные в виде беззнаковых целых чисел или чисел с плавающей точкой(4 байта в формате IEEE754)"--никак не пойму как их перевести чтобы показать в программе--может кто сталкивался??????
Нашел два способа:
1)
Код:
const
FBuffer: array [0..3] of Byte = ($85, $65, $72, $B0);--то что нужно перевести
var
i: Integer;
s: String[4];
d: Single absolute s;

begin
for i := 0 to 3 do
s[i] := Char(FBuffer[i]);
ShowMessage(FloatToStr(d));
end;
2)
Код:
res:integer
mysinglep:PSingle;
mysingle:single;
begin
res:=StrToInt('$'+Edit1.Text);
mysinglep:=@res;
mysingle:=mysinglep^;
Label2.Caption:=FloatToStr(mysingle);
end;
Admin: Пользуемся тегами!

Но оба эти варианта дают разные значения и не те что нужно((((((

Последний раз редактировалось Admin, 04.03.2009 в 10:31.
Ответить с цитированием
  #2  
Старый 04.03.2009, 12:35
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

даю два варианта... ибо могу ошибаться с расположением байт

1. Вариант
Код:
procedure TForm1.Button1Click(Sender: TObject);
Const n:single=0;
FBuffer: array [0..3] of Byte = ($85, $65, $72, $B0);//--то что нужно перевести

begin
asm
pushad
xor ecx,ecx
add ecx,3
xor dl,dl
mov eax, offset n
mov ebx, offset FBuffer
@1:
mov dl,byte ptr [ebx+ecx]
mov byte ptr [eax],dl
dec ecx
inc eax
test ecx,ecx
jnz @1;
popad
end;

 ShowMessage(FloatToStr(n));
end;

2. вариант
Код:
procedure TForm1.Button1Click(Sender: TObject);
Const n:single=0;
FBuffer: array [0..3] of Byte = ($85, $65, $72, $B0);

begin
asm
pushad
xor ecx,ecx
add ecx,3
xor dl,dl
mov eax, offset n
mov ebx, offset FBuffer
@1:
mov dl,byte ptr [ebx]
mov byte ptr [eax],dl
dec ecx
inc eax
inc ebx
test ecx,ecx
jnz @1;
popad
end;

 ShowMessage(FloatToStr(n));
end;
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.

Последний раз редактировалось Thrasher, 04.03.2009 в 12:38.
Ответить с цитированием
  #3  
Старый 04.03.2009, 13:19
Yrok Yrok вне форума
Прохожий
 
Регистрация: 04.03.2009
Сообщения: 6
Репутация: 10
По умолчанию

Спасибо за ответ!!
Ваши варианты дают значения но они не совпадают со значениями моих двух вариантов(кстати в первом варианте нужно байты местами поменять т.е. "B0726585" и тогда значения совпадают в обоих вариантах).

Вот что нашел в одном из форумов
Цитата:
8A 51 40 00 -> 650

Мантисса = 514000 bin, Для перевода в целые надо домножить на 2^23, т.е. мантисса (после перевода в десятичку) = 5324800 / (2^23)
Знак - положительный.
Порядок - 8А-80 = 0А = 2^10

Итого число = 5324800 / (2^23) * (2^10) = 650


Аналогично 85 65 72 B0 -> 25,362

Мантисса = 6572B0 bin, Для перевода в целые надо домножить на 2^23, т.е. мантисса (после перевода в десятичку) = 6648496 / (2^23)
Знак - положительный.
Порядок - 85-80 = 5 = 2^5

Итого число = 6648496 / (2^23) * (2^5) = 25,36199951171875, ну можно считать что 25,362
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:38.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025