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

cs_MrDimanche 16 Messages postés mercredi 25 juillet 2007Date d'inscription 16 avril 2008 Dernière intervention - 27 juil. 2007 à 15:05 - Dernière réponse : SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention
- 27 juil. 2007 à 18:54
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
Afficher la suite 

Votre réponse

19 réponses

Meilleure réponse
THEwarrior333 192 Messages postés vendredi 19 mars 2004Date d'inscription 30 janvier 2008 Dernière intervention - 27 juil. 2007 à 16:48
3
Merci
On peut t'aider: on va venir capitonner tes murs...

Merci THEwarrior333 3

codes-sources a aidé 87155 internautes ce mois-ci

Commenter la réponse de THEwarrior333
Meilleure réponse
cs_MrDimanche 16 Messages postés mercredi 25 juillet 2007Date d'inscription 16 avril 2008 Dernière intervention - 27 juil. 2007 à 18:49
3
Merci
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

Merci cs_MrDimanche 3

codes-sources a aidé 87155 internautes ce mois-ci

Commenter la réponse de cs_MrDimanche
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 juil. 2007 à 15:11
0
Merci
int n = atoi(chaine + 1);

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 27 juil. 2007 à 15:15
0
Merci
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++ (@++)
Commenter la réponse de SAKingdom
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 juil. 2007 à 15:17
0
Merci
OUPS, c'est depuis une chaine HEXA, j'avais zappé cela.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_MrDimanche 16 Messages postés mercredi 25 juillet 2007Date d'inscription 16 avril 2008 Dernière intervention - 27 juil. 2007 à 15:38
0
Merci
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 ?
Commenter la réponse de cs_MrDimanche
milhandril 55 Messages postés mardi 10 juin 2003Date d'inscription 11 décembre 2008 Dernière intervention - 27 juil. 2007 à 15:43
0
Merci
http://www.dreamincode.net/code/snippet30.htm



regarde la fonction atoh apres c'est jamais qu'une conversion hexa->decimal
Commenter la réponse de milhandril
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 27 juil. 2007 à 15:57
0
Merci
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++ (@++)
Commenter la réponse de SAKingdom
cs_MrDimanche 16 Messages postés mercredi 25 juillet 2007Date d'inscription 16 avril 2008 Dernière intervention - 27 juil. 2007 à 16:09
0
Merci
En fait de tous ce que j'ai trouvé rien ne marche car mes valeurs hexa sont titanesques :
Ox420E91A0FC
Commenter la réponse de cs_MrDimanche
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 juil. 2007 à 16:13
0
Merci
Fais une adaptation sur 64 bits, ce sera un très bon exercice.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_MrDimanche 16 Messages postés mercredi 25 juillet 2007Date d'inscription 16 avril 2008 Dernière intervention - 27 juil. 2007 à 16:14
0
Merci
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
Commenter la réponse de cs_MrDimanche
cs_MrDimanche 16 Messages postés mercredi 25 juillet 2007Date d'inscription 16 avril 2008 Dernière intervention - 27 juil. 2007 à 16:28
0
Merci
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
Commenter la réponse de cs_MrDimanche
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 juil. 2007 à 16:38
0
Merci
en double ???
tu es certain de cela ?

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_MrDimanche 16 Messages postés mercredi 25 juillet 2007Date d'inscription 16 avril 2008 Dernière intervention - 27 juil. 2007 à 17:19
0
Merci
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.
Commenter la réponse de cs_MrDimanche
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 juil. 2007 à 17:25
0
Merci
Un double est mini sur 64 bits mais certes on peut mettre les bits haut à 0.
Idem pour un int64.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 27 juil. 2007 à 17:54
0
Merci
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++ (@++)
Commenter la réponse de SAKingdom
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 juil. 2007 à 17:56
0
Merci
ah non, scories d'un ancien code, je vais mettre à jour.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 juil. 2007 à 18:06
0
Merci
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++
Commenter la réponse de BruNews
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 27 juil. 2007 à 18:54
0
Merci
__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++ (@++)
Commenter la réponse de SAKingdom

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.