Atoi() pour hexa (WIN32)

Résolu
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 - 28 juil. 2005 à 00:39
scoubidou944 Messages postés 714 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

11 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
28 juil. 2005 à 00:50
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++
3
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
28 juil. 2005 à 01:04
T'es un chef, MERCI !


Ciao
Urgo
0
whikie Messages postés 99 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 17 septembre 2005
28 juil. 2005 à 10:06
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.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
28 juil. 2005 à 10:18
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++
0

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

Posez votre question
whikie Messages postés 99 Date d'inscription vendredi 24 juin 2005 Statut Membre Dernière intervention 17 septembre 2005
28 juil. 2005 à 10:44
Merci beaucoup.
0
bipcpp Messages postés 40 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 2 mai 2010
29 juil. 2005 à 07:50
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;

}
0
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
22 févr. 2010 à 20:48
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
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
22 févr. 2010 à 21:59
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++
0
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
23 févr. 2010 à 15:14
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
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
23 févr. 2010 à 17:57
"...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++
0
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
23 févr. 2010 à 23:55
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
0
Rejoignez-nous