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.
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)
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 : 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
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 : 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.
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