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.
Version imprimable
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.
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)
je me trompe, c'est:
7E14AE47E17A943F
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.
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.
Pourquoi faire une recopie ? Autant tout mettre dans un tableau de unsigned chars, et caster le pointeur vers « double * ».
Code:
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
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.
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.
Ou alors :
Code:
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... :yaisse2:
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.