[R] Hex to Float - Mid-Little Endian (CDAB)
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
- Laulo7
- Niveau 1
- Messages : 6
- Enregistré le : mer. 21 oct. 2020 19:14
- Localisation : Vaucluse (84)
- Status : Hors ligne
[R] Hex to Float - Mid-Little Endian (CDAB)
Bonsoir,
je dialogue en Modbus TCIP et j'ai réussi à récupérer la plupart des informations dont j'avais besoin mais pas à les mettre toutes en formes.
Mon PB:
convertir de l'Hex (DD8E443B) en Décimal (751.4).
J'ai parcouru le net et tester plusieurs solutions mais je n'y arrive pas.
A l'aide du site : https://www.scadacore.com/tools/progra ... onverter/ j'ai vue qu'il me fallait faire la conversion de l'Hex en "Float - Mid-Little Endian".
Pourriez vous m'aider SVP.
Merci.
je dialogue en Modbus TCIP et j'ai réussi à récupérer la plupart des informations dont j'avais besoin mais pas à les mettre toutes en formes.
Mon PB:
convertir de l'Hex (DD8E443B) en Décimal (751.4).
J'ai parcouru le net et tester plusieurs solutions mais je n'y arrive pas.
A l'aide du site : https://www.scadacore.com/tools/progra ... onverter/ j'ai vue qu'il me fallait faire la conversion de l'Hex en "Float - Mid-Little Endian".
Pourriez vous m'aider SVP.
Merci.
Modifié en dernier par Laulo7 le jeu. 12 mai 2022 19:33, modifié 2 fois.
Re: Hex to Float - Mid-Little Endian (CDAB)
B
onne nouvelle Autoit dispose des fonctions nécessaires
elles sont présentes dans la documentation
En souhaitant que les exemples ci dessous répondent à votre demande
Converti un nombre decimal en hexadecimal
Converti un nombre hexadecimal en decimal

elles sont présentes dans la documentation
En souhaitant que les exemples ci dessous répondent à votre demande
Converti un nombre decimal en hexadecimal
Code : Tout sélectionner
#include <MsgBoxConstants.au3>
; Assign a Local variable the hex number representation of 1033.
Local $sHex1 = Hex(10, 4)
; Display the result.
MsgBox($MB_SYSTEMMODAL, "", $sHex1)
Converti un nombre hexadecimal en decimal
Code : Tout sélectionner
#include <MsgBoxConstants.au3>
#include <AutoItConstants.au3>
_Example()
Func _Example()
Local $iDec = Dec("000A", $NUMBER_AUTO)
MsgBox($MB_SYSTEMMODAL, "", $iDec) ; Displays the number 4095.
EndFunc ;==>_Example
- jchd
- AutoIt MVPs (MVP)
- Messages : 2282
- Enregistré le : lun. 30 mars 2009 22:57
- Localisation : Sud-Ouest de la France (43.622788,-1.260864)
- Status : Hors ligne
Re: Hex to Float - Mid-Little Endian (CDAB)
Il y a un certain mélange des "boutismes" là !
Code : Tout sélectionner
Local $tb = DllStructCreate("byte[4]")
Local $tf = DllStructCreate("float", DllStructGetPtr($tb))
; show actual memory layout
DllStructSetData($tf, 1, 751.461791992188)
ConsoleWrite(DllStructGetData($tb, 1) & @LF & @LF)
; reset so things are clear
DllStructSetData($tb, 1, Binary("0x0"))
; now the real opposite conversion
DllStructSetData($tb, 1, Binary("0xDD8E443B"))
Local $n1 = DllStructGetData($tb, 1, 1)
Local $n2 = DllStructGetData($tb, 1, 2)
Local $n3 = DllStructGetData($tb, 1, 3)
Local $n4 = DllStructGetData($tb, 1, 4)
DllStructSetData($tb, 1, $n2, 1)
DllStructSetData($tb, 1, $n1, 2)
DllStructSetData($tb, 1, $n4, 3)
DllStructSetData($tb, 1, $n3, 4)
ConsoleWrite(DllStructGetData($tb, 1) & @LF)
ConsoleWrite(DllStructGetData($tf, 1) & @LF & @LF)
; Another way:
Local $s = "DD8E443B"
Local $h = StringRegExpReplace($s, "([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{2})", "0x$2$1$4$3")
DllStructSetData($tb, 1, Binary($h))
ConsoleWrite(DllStructGetData($tb, 1) & @LF)
ConsoleWrite(DllStructGetData($tf, 1) & @LF)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: Hex to Float - Mid-Little Endian (CDAB)
Pas compris grand chose
mais je l'avais fait comme ça (raw, moins propre évidemment)

#include <WinAPIConv.au3>
$n = "DD8E443B"
$i = StringRegExpReplace($n, '(....)(....)', "$2$1")
MsgBox(0, "", _WinAPI_IntToFloat(Int("0x" & $i)))
$n = "DD8E443B"
$i = StringRegExpReplace($n, '(....)(....)', "$2$1")
MsgBox(0, "", _WinAPI_IntToFloat(Int("0x" & $i)))
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
- jchd
- AutoIt MVPs (MVP)
- Messages : 2282
- Enregistré le : lun. 30 mars 2009 22:57
- Localisation : Sud-Ouest de la France (43.622788,-1.260864)
- Status : Hors ligne
Re: Hex to Float - Mid-Little Endian (CDAB)
Ah oui, c'est vrai qu'il y a aussi ces conversions en WinAPI.
D'un autre côté c'est bien aussi de s'habituer aux DllStruct quand on travaille avec un protocole non trivial, car on peut ainsi traiter assez facilement des trames complexes entières, à condition de s'y mettre.
ModBus est big-endian.
D'un autre côté c'est bien aussi de s'habituer aux DllStruct quand on travaille avec un protocole non trivial, car on peut ainsi traiter assez facilement des trames complexes entières, à condition de s'y mettre.
ModBus est big-endian.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
- Laulo7
- Niveau 1
- Messages : 6
- Enregistré le : mer. 21 oct. 2020 19:14
- Localisation : Vaucluse (84)
- Status : Hors ligne
Re: Hex to Float - Mid-Little Endian (CDAB)
Bonsoir,
merci à tous.
Avec les valeurs de tests cela fonctionne.
Test en 'dynamique' demain.
merci à tous.
Avec les valeurs de tests cela fonctionne.
Test en 'dynamique' demain.
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: Hex to Float - Mid-Little Endian (CDAB)
ModBus ? koi tesse ? ça se mange ?

Sinon oui évidemment tu as raison sauf que quand tu connais pas, ébin c'est pas de la tarte
Je suis allé voir les entrailles de _WinAPI_IntToFloat, j'en sors ça qui est (un peu) plus clean
$xn = "DD8E443B"
$iInt = Int("0x" & StringRegExpReplace($xn, '([[:xdigit:]]{4})([[:xdigit:]]{4})', "$2$1"))
$tInt = DllStructCreate("int")
DllStructSetData($tInt, 1, $iInt)
$tFloat = DllStructCreate("float", DllStructGetPtr($tInt))
MsgBox(0, "", DllStructGetData($tFloat, 1) )
$iInt = Int("0x" & StringRegExpReplace($xn, '([[:xdigit:]]{4})([[:xdigit:]]{4})', "$2$1"))
$tInt = DllStructCreate("int")
DllStructSetData($tInt, 1, $iInt)
$tFloat = DllStructCreate("float", DllStructGetPtr($tInt))
MsgBox(0, "", DllStructGetData($tFloat, 1) )
Edit
Bon j'ai à peu près compris les Dll de ton code. Pour les maths ce sera pour plus tard

" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
- jchd
- AutoIt MVPs (MVP)
- Messages : 2282
- Enregistré le : lun. 30 mars 2009 22:57
- Localisation : Sud-Ouest de la France (43.622788,-1.260864)
- Status : Hors ligne
Re: Hex to Float - Mid-Little Endian (CDAB)
OP :
je dialogue en Modbus TCIP et j'ai réussi à récupérer la plupart des informations dont j'avais besoin mais pas à les mettre toutes en formes.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: Hex to Float - Mid-Little Endian (CDAB)
Je déconnais
Mais si Modbus est big-endian pourquoi les données obtenues par l'OP sont d'un format différent ?

Mais si Modbus est big-endian pourquoi les données obtenues par l'OP sont d'un format différent ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
- jchd
- AutoIt MVPs (MVP)
- Messages : 2282
- Enregistré le : lun. 30 mars 2009 22:57
- Localisation : Sud-Ouest de la France (43.622788,-1.260864)
- Status : Hors ligne
Re: Hex to Float - Mid-Little Endian (CDAB)
J'sais point ! Il va peut-être nous dire.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
- Laulo7
- Niveau 1
- Messages : 6
- Enregistré le : mer. 21 oct. 2020 19:14
- Localisation : Vaucluse (84)
- Status : Hors ligne
Re: * Résolu* Hex to Float - Mid-Little Endian (CDAB)
Bonjour,
Voici le bout de code que j'ai utilisé:
Voici le bout de code que j'ai utilisé:
Func _HexToLittleEndian($hHex)
Local $i , $ii
$i = StringRegExpReplace($hHex, '(....)(....)', "$2$1")
$ii = _WinAPI_IntToFloat(Int("0x" & $i))
return StringFormat("%.2i", $ii) ;formate en entier arrondi 2 chiffres apres virgule
EndFunc
Local $i , $ii
$i = StringRegExpReplace($hHex, '(....)(....)', "$2$1")
$ii = _WinAPI_IntToFloat(Int("0x" & $i))
return StringFormat("%.2i", $ii) ;formate en entier arrondi 2 chiffres apres virgule
EndFunc