bonjour,
je veut convertir une chaine contenant un hex en FLOAT,
j'ai essayer strtod(str,NULL) mais ça donne pas la valeur désirée
Exemple :
"0X21A3B50A"
ça donne un nombre sans virgule
le même résultat je l'obtient avec atoi
merci
bonjour,
je veut convertir une chaine contenant un hex en FLOAT,
j'ai essayer strtod(str,NULL) mais ça donne pas la valeur désirée
Exemple :
"0X21A3B50A"
ça donne un nombre sans virgule
le même résultat je l'obtient avec atoi
merci
0X21A3B50A n'est pas l'expression valide d'un flottant, mais d'un entier. Il faut donc tout d'abord convertir la chaîne "0X21A3B50A" en entier avec strol, strtoul ou sscanf par exemple ensuite caster cet entier en flottant. En même temps je ne comprends pas l'intérêt de faire cette conversion, que cherches-tu à faire exactement ?
Si "0X21A3B50A" est la représentation binaire de ton flottant en chaine de caractères, tu dois convertir cette chaine (représentation BCD) en décimal et pointer ton flottant sur le résultat en décimal.
En gros : (non testé, attention au little endian et big endian)
C'est très moche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 char nbStr[] = "0X21A3B50A"; char numChar[4]; numChar[3] = (char)atoi(nbStr[1]); // nbStr[0] etant "0x" numChar[2] = (char)atoi(nbStr[2]); numChar[1] = (char)atoi(nbStr[3]); numChar[0] = (char)atoi(nbStr[4]); float *res = (float *)numChar;, mais c'est pour montrer le principe. Il faut penser : réprésentation en mémoire du flottant.
Et même en remplaçant tous les nbStr[i] en nbStr[i] + i ça ne marche toujours pas. Pire, ça ne donne même pas le code BCD recherché, qui n'a déjà rien à voir avec la représentation des flottants en C.Envoyé par diogene
serialC : relis mon message plus haut. Tu as quelques exemples de conversion des chaînes ici si c'est ce dont tu as besoin.
Ok, mon code est faux, mais le principe peut-être bon.
C'est plus :
Ne sachant pas comment "0X21A3B50A" a été stocké, on ne peut faire que des hypothèses.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 char tmp[3]; strncpy(tmp, nbStr[2], 2); tmp[2]= '\0'; numChar[3] = (char)atoi(tmp); strncpy(tmp, nbStr[4], 2); ...
PS : j'ai aussi pensé au BCD.
Dans ce cas fallait mettre du pseudocode car quand tu postes un code C, il est censé marcher.Envoyé par fregolo52
Par ailleurs, ça ne marche toujours pas parce que atoi suppose que la chaîne passée en paramètre représente un entier écrit en base 10 et non en base 16.
Et enfin, même si on remplaçait atoi par une fonction atoi16 qui ferait ce que tu veux faire, ton code ne donne toujours pas le bon résultat, et on est même encore loin de l'avoir. Ca serait bien aussi si tu testais un peu tes codes avant de les poster.
Partager