Conversion real binaire

cs_difficile Messages postés 2 Date d'inscription jeudi 12 mai 2005 Statut Membre Dernière intervention 5 août 2005 - 12 mai 2005 à 09:33
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 - 13 mai 2005 à 17:31
Bonjour,
J'utilise Delphi 7 pour communiquer avec un automate Télémécanique
et je rencontre un probléme pour convertir un nombre flotant (32 bits)
en binaire. Je communique avec un socket TCPIP et pour construire la trame
il me faut des octets. exemple: Edit1.text = 253.7521 à transferer dans
une variable automate (real 32 bits) donc il faut construire les 4 bytes.

Merci

3 réponses

cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
12 mai 2005 à 17:40
Sauf erreur, Télémécanique utilise le codage IEEE 32 bits, c'est à dire le type Single



On doit pouvoir écrire :




type

TTab4Byte = Array[0..3] of Byte;

PTab4Byte = ^TTab4Byte;

var

Ptr : PTab4Byte;

IEEE32 : Single;

begin

IEEE32 : = Pi;

Ptr := Pointer(@IEEE32); // et les 4 octets sont : Ptr^[0],
Ptr^[1]
, Ptr^[2]
et Ptr^[3]


end ;





A vérifier : l'ordre des octets dans l'automate, mais ça doit être le même que dans un PC


Ken@vo


<hr size ="2" width="100%">
Code, Code, Codec !

0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
12 mai 2005 à 21:54
Tout à fait Kenavo.

Pour être précis :
"Le format flottant utilisé est celui de la norme IEEE STD 734-1985 (équivalence IEC559). La longueur des mots est de 32 bits, ce qui correspond à des nombres flottants simple précision."

Par contre c'est direct :

var
IEEE32 : Single;

begin
IEEE32 := FloatToStr(Edit1.text) ;
// IEEE32 contient le nombre au format réel, tu le transmets tel quel.
// La valeur récupérée pourra être directement utilisée dans un %MF

end;

Cordialement.
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
13 mai 2005 à 17:31
Et à la question que tu te poses maintenant :



Oui, tu peux faire l'opération inverse à partir d'un paquet d'octets reçu :





T
ype

TTab4Byte = Array[0..3] of Byte;
PTab4Byte = ^TTab4Byte;
var
Ptr : PTab4Byte;
IEEE32 : Single;
begin
Ptr : = Pointer(@IEEE32); // et les 4 octets sont : Ptr^[0], Ptr^[1]
, Ptr^[2]
et Ptr^[3]


Ptr^[0]:= OctetsRecus[i];


Ptr^[1]:=OctetsRecus[i+1];


Ptr^[2]:=OctetsRecus[i+2];


Ptr^[3]:=OctetsRecus[i+3];


end ;



On peut aussi créer un pointeur sur Single,



var


PileReception : array[0..99] of byte; // la pile de reception de données


........

var

IEEE32 : Single;

ps : ^Single;

begin

Ps : = Pointer(@pile[i]); // i est l'index du premier octet du réel

IEEE32:= Ps^;

end ;




Ken@vo


<hr size ="2" width="100%">
Code, Code, Codec !

0
Rejoignez-nous