Atoi() pour hexa (WIN32) [Résolu]

Messages postés
780
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 avril 2009
- - Dernière réponse : scoubidou944
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
- 23 févr. 2010 à 23:55
Bonsoir,

j'aimerais savoir s'il existe un équivalent de la fonction atoi() POUR la base 16?



exemple:

char* szNumber = "123";


int i = atoi(szNumber);

Ceci marche impec...



MAIS:

char* szNumber = "123FB8C";


int i = atoi(szNumber);

Ne marche pas (normal)...



Merci de bien vouloir m'aider car j'ai sûrement mal cherché...


Urgo
Afficher la suite 

11 réponses

Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
3
Merci
Un truc comme ça t'irait ?

DWORD 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++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 122 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
780
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 avril 2009
1
0
Merci
T'es un chef, MERCI !


Ciao
Urgo
Commenter la réponse de cs_Urgo
Messages postés
99
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
17 septembre 2005
0
Merci
Bonjour a tous,

je profite de ce post pour poser une question en rapport...

Voila je voudrais savoir s'il existe une fonction pour afficher un decimal en binaire.

Je connais deja la fonction pour afficher des decimals en hexadecimal :

printf("%X",variable)
permet de convertir une variable en hexadecimal

mais je ne trouve pas l'equivalent pour le binaire

Merci d'avance.
Commenter la réponse de whikie
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
prépare dans une chaine avant et affiche ensuite (moi et les consolades...):
char chaine[36];
itoa(nbr, chaine, 2);
ton printf de la chaine ici.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
99
Date d'inscription
vendredi 24 juin 2005
Statut
Membre
Dernière intervention
17 septembre 2005
0
Merci
Merci beaucoup.
Commenter la réponse de whikie
Messages postés
40
Date d'inscription
mardi 18 mai 2004
Statut
Membre
Dernière intervention
2 mai 2010
0
Merci
Méthode utilisant le c++ et les string de la STL (extrait des fonctions Bip) :



Prototypes des fonctions :

int BG_StringToInt (const string sString, const int iBase = 10);

string BG_IntToString (const int iInt, const int iBase = 10);



Fonctions :

#include <string>

#include <sstream>

//-----------------------------------------------------------------

//! BG_IntToString : Convert an integer into a string !

//-----------------------------------------------------------------

//! iInt : int number to
convert
!

//! iBase : base of the number into the string (default = 10) !

//!
!

//! return : number into a
string
!

//-----------------------------------------------------------------

string BG_IntToString (const int iInt, const int iBase)

{

int iTemp;

ostringstream sStream;



// use decimal if base is ko

if (iBase != 10 && iBase != 16 && iBase != 8 && iBase != 2)

iTemp = 10;

else

iTemp = iBase;



sStream << setbase (iTemp) << iInt;





return sStream.str();

}



//-----------------------------------------------------------------

//! BG_StringToInt : Convert a string to an
integer
!

//-----------------------------------------------------------------

//! sString : string contaning integer
value
!

//! iBase : base of the number into the string (default = 10) !

//!
!

//! return : integer
value
!

//-----------------------------------------------------------------

int BG_StringToInt (const string sString, const int iBase)

{

int iBGint;

int iTemp;



// return zero if string is empty

if (sString == "")

return 0;



// use decimal if base is ko

if (iBase != 10 && iBase != 16 && iBase != 8 && iBase != 2)

iTemp = 10;

else

iTemp = iBase;



istringstream sStream (sString);

sStream >> setbase (iTemp) >> iBGint;



return iBGint;

}
Commenter la réponse de bipcpp
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
0
Merci
Sans vouloir réinventer la roue (ni faire du necro-posting) :

TCHAR strBuff[256] = _TEXT("0x123456"); // 1193046 in decimal
LONG val = 0;
_stscanf_s(strBuff, _TEXT("%x"), &val);

TCHAR strBuff2[256] = _TEXT("123456"); // 1193046 in decimal
LONG val2 = 0;
_stscanf_s(strBuff2, _TEXT("%x"), &val2);

val val2 1193046 // (en décimal donc)

----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
oui oui mais comme toutes les fonctions à nbr d'auguments indéterminés c'est lent 'by design', voire très lent.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
0
Merci
OSEF, c'est portable, rapide à écrire & propre.
On fait des benchs après quand tout fonctionne.

Et au final, est ce que cela vaut le coup d'optimiser une fonction qui sera appelée peut-être que 20 fois ?
Est ce que cela faut le coup si demain il veut faire une conversion en Octal et devra écrire une nouvelle fonction ?

Je pense que l'optim' est ailleurs ;p

----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
"...qui sera appelée peut-être que 20 fois..."

Ne jamais présupposer de la sorte, l'optim doit être partout.
Je fais des modules de prétraitement pour des fichiers arrivant depuis des AS400 et autres joyeux systèmes de ce genre pour justement mettre en forme dates et nombres afin qu'un L4G puisse lancer un BULK_INSERT vers un Sql Server. Ce sont des centaine de milliers de lignes à traiter.

Si on ne pense pas direct optimisé c'est chomage en vue. A perfs quasi égales, un patron fera faire par un clicomane en interprété pour bien moins cher et il aura raison.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
0
Merci
C'est un point de vue.
Ancien lead developper C++ dans le jeux vidéo, nos contraintes à nous c'était le temps réel et le frame rate mais on n'est pas là pour comparer nos CVs ;p

Pour les questions simples, on a généralement un débutant. Est ce qu'il ne vaut mieux pas se mettre à sa hauteur pour ce qui lui convient et non ce qui est optimum (Madame Michu ne supportera pas un Windows d'Admin réseau et réciproquement).
Si on évite aux newbies de réinventer la roue c'est un grand pas.

Quand il reviendra poser une question sur les perf', on pourra parler de benchmark, VTune & Cie.

----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944