Convertion string hexa

Résolu
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 1 août 2006 à 23:44
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 2 août 2006 à 14:18
Bonjour,

Je cherche l'inverse de la fonction itoa. Pour convertir une chaine de caractère en héxadécimal.

J'utilise la fonction suivante pour convertir un entier en héxa dans une chaine :
DWORD dwTest;
char szBuffer[32 + 1] = "";
itoa(dwTest, szBuffer, 16);

J'aimerai la fonction qui fasse l'inverse, atoi ne fonctionne pas puisqu'on ne peux spécifié le base16.

Merci

10 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
2 août 2006 à 14:14
Il faut lire la documentation sur une fonction avant de l'utiliser et de dire à tort qu'elle ne fonctionne pas.

Si un long est codé sur 32 bits alors 3419196878 est en dehors du rang si il est signé (ce qui est le cas par défaut).

const char * s = "cbcccdce";

unsigned long n = strtoul(s, NULL, 16);
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 août 2006 à 00:11
#include <math.h>

int HexToDec(char *Hexadecimal)
{    int i 0, decimal 0, Long = 0, ANSI_Hexa = 0;

    while(Hexadecimal[Long] != 0)
        Long++;

    for(i=Long-1;i>=0;i--)
    {
        if(Hexadecimal[i] >= 48 && Hexadecimal[i] <= 57)
            decimal = decimal + (Hexadecimal[i]-48)*((int)pow(16, i));
        else
        {
            ANSI_Hexa = Hexadecimal[i];
            decimal = decimal + ((ANSI_Hexa-55)*(int)pow(16, i));
        }
    }
    return decimal;
}

Cette fonction convertira une chaine de caratère en majuscule (FF00FF par exemple) en entier.
C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution

http://programmationdebat.discutforum.com
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
2 août 2006 à 00:12
Il faut utiliser les fonctions strto*, soit strtol pour convertir une chaine vers un long.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 août 2006 à 00:21
[auteurdetail.aspx?ID=617077 SAKingdom]
> Pas beau du tout d'utiliser pow pour faire ca (utiliser les opérateur de décalage)
Toi qui parle si souvent d'optimisation c'est un peu dommage (par exemple toujours finir tes boucles vers zéros, en gros ca sert à rien)
Ton Hexadecimal n'est pas déclaré, mais autant utiliser un tableau de taille 256
Hexadecimal[i] = i pour ['1'..'9']
Hexadecimal['A'] = Hexadecimal['a'] = 10; etc

_____________________________________
Un éditeur de ressources gratuit pour Windows
0

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

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 août 2006 à 00:24
Cette fonction n'est pas de moi. C'est un simple copier coller. Je ne connaissait pas non plus strtol.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution

http://programmationdebat.discutforum.com
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
2 août 2006 à 09:08
J'ai fait une soource de conversion vers les chaines de caractères, spritf() quoi, plus quelques autres fonctions... C'est par ici

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
2 août 2006 à 09:10
Oups...pardon!
Je viens de relire le sujet...et c'est en fait dans l'autre sens :( désolé

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
2 août 2006 à 13:08
Merci pour les réponses. J'ai testé strtol mais je n'obtiens pas le résultat voulu.

char szHexa[] = "cbcccdce";
DWORD dwHexa;
char *pEnd;

dwHexa = strtol(szHexa, &pEnd, 16);

Résultat dwHexa = 2147483647 au lieu de 3419196878 , si quelqu'un peux m'expliquer pourquoi.
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
2 août 2006 à 13:18
Ok j'ai capté pourquoi ça fonctionne pas, la fonction strtol n'accepte que des caractères numériques dans la chaine (comme aoti), elle ne peux donc pas convertir une chaine hexadécimale...
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
2 août 2006 à 14:18
MERCI STEVE!!!
0
Rejoignez-nous