Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.06;
Скачать: CL | DM;

Вниз

Перевод из числа FLOAT в Single (запись из 4 байт)   Найти похожие ветки 

 
Layner ©   (2005-05-20 12:02) [0]

Подскажите, как перевести число 106.48999786 в $42D4FAE1? Т.е. у меня есть переменная типа Single, ей надо присвоить значение $42D4FAE1. Это наверное с указателями надо делать?
В обратную сторону могу сделать, с помощью совета Alx2 ©   (19.05.05 16:53)
procedure TForm1.Button4Click(Sender: TObject);
var D: Single;
begin
Integer((@D)^) := $42D4FAE1;  // E1 FA D4 42  - только "наоборот"
ShowMessage(FloatToStr(D));   // Видим, что D = 106.48999786377
end;


А вот ещё бы узнать, как наоборот..
Заранее благодарю.


 
denisww ©   (2005-05-20 12:08) [1]

щас под рукой нет delphi
но есть функция типа IntToStrHex
то бишь
IntToStrHex(Integer((@D)^) )


 
Layner ©   (2005-05-20 12:18) [2]

denisww
Понял, спасибо, попробую.


 
evvcom ©   (2005-05-20 12:23) [3]

MyRec = record
 case Integer of
   1: (SingleVar: Single);
   2: (IntegerVar: Integer);
end;


 
Marser_temp   (2005-05-20 12:25) [4]


> IntToStrHex(Integer((@D)^) )

Просто IntToHex


 
Sha ©   (2005-05-20 12:49) [5]

> Layner ©   (20.05.05 12:02)

Судя по другим твоим вопросам,
тебе нужно копировать данные в формате Real
между буфером и своими переменными,
а вовсе не переводить их туда-сюда.

Для этого:

type
 PReal= ^Real;
var
 t: Real;
 b: array[0..1023] of byte;
 i: integer;
begin;
 ...
 t:=PReal(@b[i])^; //взяли из буфера
 ...
 PReal(@b[i])^:=t; //поместили в буфер
 ...
 end;


 
Layner ©   (2005-05-20 13:24) [6]

Sha
Да нет вроде, нужно число например 45,66 записать в порт. Это число надо привести к формату Single, что бы у него был размер 4 байта. А в процедуре, что в вопросе, я читаю из этого пакета данные, а пакет отловил снифером, его шлет др. программа. (Т.е. мне надо создать почти такую же программу).


 
Sha ©   (2005-05-20 13:31) [7]

> Layner ©   (20.05.05 13:24) [6]
> Да нет вроде

Да вроде да :)

> нужно число например 45,66 записать в порт.
> Это число надо привести к формату Single,
> что бы у него был размер 4 байта.

Интересно, а в каком формате оно было до приведения?
Вряд ли Integer :)

> А в процедуре, что в вопросе, я читаю из этого пакета данные...

Т.е. хочешь взять Real число из буфера, пример я дал :)


 
Sha ©   (2005-05-20 13:51) [8]

Layner ©   (20.05.05 13:24) [6]

Не забывай, в буфере лежит обычное число типа Real длиной 4 байта,
а не 8 байт, соответствующих его 16-ричному представлению.

По-существу, ты просто должен присвоить значение одной
переменной (из буфера) другой переменной (локальной).


 
Sha ©   (2005-05-20 14:15) [9]

Sorry, я везде в своих постах имел ввиду Single, а писал Real.


 
Layner ©   (2005-05-20 14:21) [10]

Sha
Real 8 байт, он мне не пойдет, формат строго стандартен. Под число отводится 4 байта, я написал:
type
Psingle= ^Single;

...
procedure TForm1.Button6Click(Sender: TObject);
var
sl: Single;
f: double;
begin
 f:=106.48999786377;    //  = $42D4FAE1 (или байты наоборот)
 sl:=PSingle(@f)^;
 ShowMessage(FloatToStr(sl));  //это кон. не верно, но как увидеть что в SL?
end;


 
Layner ©   (2005-05-20 14:26) [11]

Sha ©   (20.05.05 14:15)
Только что прочитал этот ответ :) Да, все надо Single. Ещё расширю своё "описание". В общем я в сеть отправляю данные. Так:


procedure TForm1.Button3Click(Sender: TObject);
var
Addr: TSockAddr;
buf : array [0..38] of Byte;   //word
begin
buf[0]:=$81;
...
buf[35]:=$00;
buf[36]:=$00;
buf[37]:=$03;
buf[38]:=$43;
Addr.sin_family := AF_INET;
Addr.sin_addr.S_addr := INADDR_ANY;
TcpClient1.SendTo(buf, sizeof(buf), Addr, 0);
end;

И надо всего лишь вместо buf[35]-buf[38] подставить число предположим 45,66, в формате 4 байт, а то есть Single. Sha, черкну потом на мыло, если сделаю, куда слать вам пиво :)


 
default ©   (2005-05-20 14:29) [12]


procedure TForm1.Button1Click(Sender: TObject);
var
 f: Single;
begin
 f := 106.48999786377;
 ShowMessage(IntToHex(PInteger(@f)^, 8))
end;


 
Layner ©   (2005-05-20 14:33) [13]

buf : array [0..38] of Byte;
Я обьявил как Byte, пакет состоит из разных данных. Т.е. типа так:

00 00 00 - заголовок 3 байта
00       - флаг 1 байт
00 00 00 00 00 00 - дата 6 байт
00 00 - описание..
....
00 00 00 00 - значение 1 числа, 4 байта, Single
00 00 00 00 - значение 2 числа, 4 байта, Single
00 00 00 00 - значение 3 числа, 4 байта, Single


Я формирую побайтово пока руками и шлю в сумме так TcpClient1.SendTo(buf, sizeof(buf), Addr, 0);, может конечно легче формировать верх по байтово, а низ приплюсовать другой формат данных, т.е. из Single, но как это реализовать не знаю.

Еще, с паскалем вроде давно, но на уровне байт не очень, сейчас поищу что нибудь почитать по этой теме, прошу не смеятся, если что не то пишу :)


 
Layner ©   (2005-05-20 14:36) [14]

default ©   (20.05.05 14:29)
О, чуть понятнее, сейчас к своему buf приплюсовать вместо buf[35]-buf[38] попробую.


 
Sha ©   (2005-05-20 14:43) [15]

> Layner ©   (20.05.05 14:26) [11]

вместо

buf[35]:=$00;
buf[36]:=$00;
buf[37]:=$03;
buf[38]:=$43;


надо

f:=106.5;
PSingle(@buf[35])^:=f;


и все.


 
default ©   (2005-05-20 14:45) [16]

Layner ©   (20.05.05 14:36) [14]
лучше вам запись сделать, а не абстрактный массив байт
чтобы не писать
"buf[35]:=$00;
buf[36]:=$00;
buf[37]:=$03;
buf[38]:=$43;"
не писать
PSingle(@buf[35])^:= 25.2323 (произвольно взял)
а писать типа Rec.MasNumber[2] := 25.2323 ...


 
Layner ©   (2005-05-20 15:03) [17]

Sha ©   (20.05.05 14:43)
default ©   (20.05.05 14:45)

Спасибо за помощь! Сейчас сделал, так снифер с сетевой картой перестал работать, а сервер перегрузить просто так не дают, теперь уж до понедельника придется оставить.



Страницы: 1 вся ветка

Текущий архив: 2005.06.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.054 c
6-1111443454
Villi.GPInet
2005-03-22 01:17
2005.06.06
Команда LIST протокола FTP


8-1108654118
Sun
2005-02-17 18:28
2005.06.06
DXImageList


6-1108481093
НовичокОК
2005-02-15 18:24
2005.06.06
Как узнать имя пользователя (компа) занявшего ресурс?


14-1116528383
SPeller
2005-05-19 22:46
2005.06.06
Веселое сообщение от IE


1-1116569296
Borsuk
2005-05-20 10:08
2005.06.06
Как узнать есть ли " * " в ячейки таблицы?