Hexa -> Deci

Résolu
skotmarud Messages postés 116 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 26 janvier 2008 - 10 août 2005 à 07:15
skotmarud Messages postés 116 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 26 janvier 2008 - 10 août 2005 à 19:33
bonjour,
je veux convertir de l'hexadecimal en decimal et j'ai trouver dans le forum
une fonction qui fonctionne à moitier en fait ,
int valeur= strtol ( gh, &gh, 16);
aparament elle est limitée à 7FFFFFFF = 2147483647
je veux pouvoir convertir un nombre beaucoup plus grand,
y a t'il une solution s'il vous plait ?

8 réponses

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
10 août 2005 à 08:12
strtol retourne un long (strto[l], string to long), sur ton systeme ca
doit etre un entier signé sur 32 bits, la valeur maximun représentable
est (2^31 -1) == 2147483647, utilises strtoul (unsigned long) pour
pouvoir aller jusqu'a 4294967296.
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 août 2005 à 09:31
DWORD __stdcall HexaToDecimal(const char* pszHexa)
{ DWORD ret 0, t 0, n = 0;
const char *c = pszHexa;
while(*c && (n < 16)) {
if((*c >= '0') && (*c <= '9')) t = (*c - '0');
else if((*c >= 'A') && (*c <= 'F')) t = (*c - 'A' + 10);
else if((*c >= 'a') && (*c <= 'f')) t = (*c - 'a' + 10);
else break;
n++; ret *= 16; ret += t; c++;
if(n >= 8) break;
}
return ret;
}

ciao...
BruNews, MVP VC++
3
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
10 août 2005 à 10:43
Je vais finir par reprendre gout à manipuler du char* ! Tu n'as peut etre pas besoin de ta variable c (?), j'aurais directement utilisé la variable pszHexa dans ta boucle puisque le pointeur est passé en copie. Qu'en penses tu ?
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
10 août 2005 à 10:53
C'est jolie toutes ces étoiles mais ca existe déjà, strto*, *scanf... Pourquoi réécrire ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
10 août 2005 à 10:58
... pour apprendre à manipuler des chaines. Sinon, std::istringstream ou scanf.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 août 2005 à 11:00
certain que on peut utiliser direct pszHexa au lieu de 'c' mais ensuite c'est moins long à écrire, je suis grave fainéant.... dans tous les cas le compilo produira le même code.

steve > c'est plus rapide, on empile 1 param au lieu de 3 pour strto*.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 août 2005 à 11:02
OUPS j'ai dit une connerie, c'est encore plus rapide car compilo moderne n'empilera rien du tout, il passe direct en registre.

ciao...
BruNews, MVP VC++
0
skotmarud Messages postés 116 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 26 janvier 2008
10 août 2005 à 19:33
merci de votre aide ça fonctionne très bien!!
0
Rejoignez-nous