Conversion real binaire

Signaler
Messages postés
2
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
5 août 2005
-
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
-
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

Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
3
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 !

Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
2
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.
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
3
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 !