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

cs_Urgo 780 Messages postés lundi 16 décembre 2002Date d'inscription 16 avril 2009 Dernière intervention - 28 juil. 2005 à 00:39 - Dernière réponse : scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention
- 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

Répondre au sujet
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 28 juil. 2005 à 00:50
+3
Utile
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++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BruNews
cs_Urgo 780 Messages postés lundi 16 décembre 2002Date d'inscription 16 avril 2009 Dernière intervention - 28 juil. 2005 à 01:04
0
Utile
T'es un chef, MERCI !


Ciao
Urgo
Commenter la réponse de cs_Urgo
whikie 99 Messages postés vendredi 24 juin 2005Date d'inscription 17 septembre 2005 Dernière intervention - 28 juil. 2005 à 10:06
0
Utile
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 28 juil. 2005 à 10:18
0
Utile
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
whikie 99 Messages postés vendredi 24 juin 2005Date d'inscription 17 septembre 2005 Dernière intervention - 28 juil. 2005 à 10:44
0
Utile
Merci beaucoup.
Commenter la réponse de whikie
bipcpp 40 Messages postés mardi 18 mai 2004Date d'inscription 2 mai 2010 Dernière intervention - 29 juil. 2005 à 07:50
0
Utile
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
scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 22 févr. 2010 à 20:48
0
Utile
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 22 févr. 2010 à 21:59
0
Utile
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
scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 23 févr. 2010 à 15:14
0
Utile
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 23 févr. 2010 à 17:57
0
Utile
"...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
scoubidou944 728 Messages postés mardi 22 avril 2003Date d'inscription 19 janvier 2017 Dernière intervention - 23 févr. 2010 à 23:55
0
Utile
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

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.