Convertir une chaine de caractère (hexa) en int [Résolu]

Signaler
Messages postés
16
Date d'inscription
mercredi 25 juillet 2007
Statut
Membre
Dernière intervention
16 avril 2008
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Voila,
Mon problème est simple.
Dans une string (char[100]), j'ai ceci : E9876. Je voudrais obtenir sa valeur en int. Comment faire, j'ai beau chercher je ne trouve rien

19 réponses

Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008

On peut t'aider: on va venir capitonner tes murs...
Messages postés
16
Date d'inscription
mercredi 25 juillet 2007
Statut
Membre
Dernière intervention
16 avril 2008

Je pense que c'est peut être un peu trop sophistiqué pour ce que je voulais faire, alors j'ai pris ma chaine, je l'ai coupée en deux autres chaînes, et j'ai fait
double time = (double)(strtoul( str2, NULL, 16 ))*16777216+strtoul( str, NULL, 16 );
Bon ça parait un peu viellot et basic comparé à vos propositions mais bon, merci beaucoup
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
int n = atoi(chaine + 1);

ciao...
BruNews, MVP VC++
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
chaine+1 ? Je crois que le E fais partie du nombre à convertir. Ce serait donc de l'hexadécimale.

http://www.codyx.org/snippet_conversion-hexadecimal-decimal_132.aspx#642

C++ (@++)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
OUPS, c'est depuis une chaine HEXA, j'avais zappé cela.

ciao...
BruNews, MVP VC++
Messages postés
16
Date d'inscription
mercredi 25 juillet 2007
Statut
Membre
Dernière intervention
16 avril 2008

J'ai trouvé ça
http://www.cppfrance.com/infomsg_STRING-FORME-HEXA-ENTIER_322008.aspx
c'est très bien pour ce que je veux, mais trop court, meme strtoul est trop court. En existe t-il d'autres ?
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

http://www.dreamincode.net/code/snippet30.htm



regarde la fonction atoh apres c'est jamais qu'une conversion hexa->decimal
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Trop court ? Ça veut dire quoi ?

Sinon, j'ai fourni un lien vers un code de notre ami BruNews qui permet de convertir une chaine sous format hexa vers un DWORD et ce sans pow ou autre fonction mathématique inutile pour ce genre de chose.

Va y jeter un oeil.

C++ (@++)
Messages postés
16
Date d'inscription
mercredi 25 juillet 2007
Statut
Membre
Dernière intervention
16 avril 2008

En fait de tous ce que j'ai trouvé rien ne marche car mes valeurs hexa sont titanesques :
Ox420E91A0FC
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Fais une adaptation sur 64 bits, ce sera un très bon exercice.

ciao...
BruNews, MVP VC++
Messages postés
16
Date d'inscription
mercredi 25 juillet 2007
Statut
Membre
Dernière intervention
16 avril 2008

En fait, je me dois d'admettre mon ignorance, et je ne sais absolument pas me servir d'un DWORD, j'aurais besoin d'un peu plus d'indication que ce qui est donné. Je vais essayer de trouver.
Merci
Messages postés
16
Date d'inscription
mercredi 25 juillet 2007
Statut
Membre
Dernière intervention
16 avril 2008

Attention, je commence à atteindre mon point critique. J’ai d'ailleurs bien entamé le plâtre du mur près de mon bureau. Malheureusement, j'ai l'impression que de me cogner la tête sur tout ce que je trouve ne fait pas bien avancer mon boulot. Il faut absolument que quelqu'un m'offre une solution avant que tout cela ne me coute trop cher en ciment, peinture, pansement et aspirine. Quelqu'un peut-il me tirer de cet état de folie déjà bien avancé, bien des gens se sont fait enfermer pour moins que ça, en me donnant quelque chose qui me le retourne en double ? Je vous laisse, je prends mes petits cachets roses et je passe au mur suivant.
Merci de votre attention
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
en double ???
tu es certain de cela ?

ciao...
BruNews, MVP VC++
Messages postés
16
Date d'inscription
mercredi 25 juillet 2007
Statut
Membre
Dernière intervention
16 avril 2008

Oui, je suis sûr que ce devrait être en double car cet hexa encode 6bytes, soit 48 bits. Je ne puis faire autrement ;(
Je veux bien que vous veniez, mais il n'y a plus de mur dans mon bureau. On ira chez mon collègue, je suis sûr qu'il appréciera.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Un double est mini sur 64 bits mais certes on peut mettre les bits haut à 0.
Idem pour un int64.

ciao...
BruNews, MVP VC++
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ce n'est pas très difficile d'adapter le code de BruNews.
ret qui est un DWORD devra être remplacé par un __int64
n devra pouvoir monter jusqu'à 16.
C'est tout, menfin je crois. Je l'ai adapter et tout fonctionne parfaitement.

En passent BruNews:
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;
}

n est testé 2 fois.
Les valeurs testées sont différentes.

C'est voulu ?

C++ (@++)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
ah non, scories d'un ancien code, je vais mettre à jour.

ciao...
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
DWORD __stdcall HexaToDecimal(const char* pszHexa)
{  DWORD ret 0, t 0, n = 8, c;
  while(c = *pszHexa) {
    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;
    ret *= 16; ret += t;
    pszHexa++;
    if(--n == 0) break;
  }
  return ret;
}

ciao...
BruNews, MVP VC++
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
__int64 __stdcall HexaTo64Decimal (const char* pszHexa)
{
    __int64 ret = 0;
    DWORD t, n = 16, c;
    while(c = *pszHexa) {
        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;
        ret *= 16; ret += t; pszHexa++;
        if(!--n) break;
  }
  return ret;
}

C++ (@++)