Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
ВнизПеревод из числа 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.013 c