Bonjour, je voudrais convertir un string en hexadécimal vers du décimal double précision.
Voici le hex : 7E14AE47
qui devrait donner : 0.02 en décimal.
Je sais vraiment pas comment faire.
Bonjour, je voudrais convertir un string en hexadécimal vers du décimal double précision.
Voici le hex : 7E14AE47
qui devrait donner : 0.02 en décimal.
Je sais vraiment pas comment faire.
amicalement, mess-mate ( debian/debian-like )
Une petite recherche sur le forum...et hop
LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
Albert
Euh, tu n'en as que pour 32 bits ici. C'est seulement de la simple précision...
Dans tous les cas, tu convertis ça en unsigned int (ou unsigned long si tu n'es pas sur une architecture LP64), puis tu fais un memcpy() vers un float (ou tu joues avec les reinterpret_cast<> de pointeurs)
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
je me trompe, c'est:
7E14AE47E17A943F
amicalement, mess-mate ( debian/debian-like )
Une petite recherche sur le forum...et hop
LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
Albert
Eh bien, comme j'ai dit. En C, je ferais un strtoull() (C99, ou deux strtol() sinon) pour obtenir un long long, puis je ferais un memcpy() vers un double.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Eh non. Le strtoxxx n'est valable que pour du décimal, pas pour le hex.
Je crois qu'il faut passer par hex->bin->dec.
Là où tout ce complique c'est de le passer en 64bits.( du float).
Khexedit le fait très bien, je vois bien le nombre décimal exact sur 64bits.
Le problème c'est d'écrire un programme soi-même en c++ afin d'arriver à la même chose.
amicalement, mess-mate ( debian/debian-like )
Une petite recherche sur le forum...et hop
LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
Albert
Pourquoi faire une recopie ? Autant tout mettre dans un tableau de unsigned chars, et caster le pointeur vers « double * ».
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <iostream> using namespace std; int main (void) { unsigned char nombre[] = { 0x7E, 0x14, 0xAE, 0x47, 0xE1, 0x7A, 0x94, 0x3F }; cout << *(double *)nombre << endl; return 0; } $ ./double 0.02
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
La méthode Obsidan marche mais n'est pas applicable sinon il faut transformer le string 7E14AE47E17A943F et encore si c'est possible.
En effet le hex est lu d'un fichier en raw dans un string:
par ex: dansLeString : 7E14AE47E17A943F
J'ai essayé également le strtoul et aucun résultat valable même en le multipliant par 2. ( Le strtoull existe ?? J'ai pas trouvé. )
Pour l'instant j'ai trouvé aucune solution pour une conversion vers un double, même en passant par Hex->Bin->Double.
Il y a un tas de conversions sur le net mais rien pour du double.
amicalement, mess-mate ( debian/debian-like )
Une petite recherche sur le forum...et hop
LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
Albert
strtoull() est, si je ne m'abuse, une fonction C99.
Pour pouvoir faire deux strtol(), je pense que tu vas devoir partager ta chaîne en deux.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Ou alors :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <iostream> using namespace std; int main (void) { char c; int x; unsigned char nombre[sizeof(double)]; string s("7E14AE47E17A943F"); for (x=0;x<(sizeof(double)*2);++x) { c = s[x]; if (c>='0' && c<='9') c -= '0' ; else if (c>='A' && c<='F') c -= ('A' - 10); else if (c>='a' && c<='f') c -= ('a' - 10); else break; if (x & 1) nombre [x >> 1] += (unsigned char)c; else nombre [x >> 1] = (unsigned char)c << 4; } cout << *(double *)nombre << endl; return 0; }
Waw.. mais c'est la simplicité même...
C'est en fait tout ce qu'il me fallait.
J'ai vraiment cherché la complexité quoique le plus simple est le plus difficile.
Merci Obsidan pour ce code et également merci à tous que j'avais peut-être mis sur une mauvaise piste.
Il faut maintenant que je le mette en oeuvre pour transformer mon fichier data en binaire vers un fichier texte data ainsi que la transformation des short, int,long et unsigned.
PS: la prochaine étape est la transformation d'un binaire double vers le décimal.
amicalement, mess-mate ( debian/debian-like )
Une petite recherche sur le forum...et hop
LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
Albert
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager