Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.012 c
14-1116605847
Жук\\
2005-05-20 20:17
2005.06.06
Загрузка компьютера


1-1116615022
Volume
2005-05-20 22:50
2005.06.06
Name


9-1110489198
Домовенок
2005-03-11 00:13
2005.06.06
[GLScene] Быстрое обращение к объектам


14-1116563537
__DATA__
2005-05-20 08:32
2005.06.06
Ф-ия для перевода денег во время с разделенными тарифами


1-1116480020
Аноним
2005-05-19 09:20
2005.06.06
Всем Как в консолном приложении вернуть Error level для обработки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский