Convertir une chaine de caractère (hexa) en int

Résolu
cs_MrDimanche Messages postés 16 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 avril 2008 - 27 juil. 2007 à 15:05
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 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

19 réponses

THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
27 juil. 2007 à 16:48
On peut t'aider: on va venir capitonner tes murs...
3
cs_MrDimanche Messages postés 16 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 avril 2008
27 juil. 2007 à 18:49
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
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 juil. 2007 à 15:11
int n = atoi(chaine + 1);

ciao...
BruNews, MVP VC++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
27 juil. 2007 à 15: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++ (@++)
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 juil. 2007 à 15:17
OUPS, c'est depuis une chaine HEXA, j'avais zappé cela.

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



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

ciao...
BruNews, MVP VC++
0
cs_MrDimanche Messages postés 16 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 avril 2008
27 juil. 2007 à 16:14
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
0
cs_MrDimanche Messages postés 16 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 avril 2008
27 juil. 2007 à 16:28
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 juil. 2007 à 16:38
en double ???
tu es certain de cela ?

ciao...
BruNews, MVP VC++
0
cs_MrDimanche Messages postés 16 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 avril 2008
27 juil. 2007 à 17:19
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 juil. 2007 à 17: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++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
27 juil. 2007 à 17:54
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++ (@++)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 juil. 2007 à 17:56
ah non, scories d'un ancien code, je vais mettre à jour.

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
27 juil. 2007 à 18:06
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++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
27 juil. 2007 à 18:54
__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++ (@++)
0
Rejoignez-nous