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.