Résultats de 1 à 5 sur 5

Sujet : Conversion chaine entier hexadecimal 16

  1. #1
    Visiteur MP
    Visiteur MP

    Conversion chaine entier hexadecimal 16

    Bonjour,

    Je souhaiterais convertir une chaine en entier base 16, tout comme le fait la fonction atoi en base 10.

    Ex: j\'ai la chaine \"0x013036\" et je souhaiterais qu\'elle devienne l\'entier hexa 0x013036.

    Existe-t-il un moyen simple de le faire ?

    merci d\'avance pour votre aide

    Cako 19

  2. #2
    Membre MP
    Inscrit
    août 2013
    Messages
    2 538
    tu peux utiliser atoi( const char *string ) pour convertir un char en int, fé ta convertion en base 16 après. tu peux utiliser _itoa après qui prend en parametre le radix ...

    par contre ça c\'est sur .NET je ne sais pas si c\'est des surcharges ( apparament oui \"_\" ) mais je pense que tu dois pouvoir les utilisés. tout depend sur koi tu travail ...
    Admin retraité du site MoteurProg.Com" la meilleur façon de remercier est de pouvoir aider les autres à son tour !! "http://www.moteurprog.com

  3. #3
    Visiteur MP
    Visiteur MP
    Je développe en C sous Visual C++.

    Le problème, c\'est que atoi( chaine ) renvoie 0 quand chaine = \"0x013036\".

    De plus, _itoa convertit un entier en hexa alors que je souhaiterais juste avoir ce nombre (0x013036 qui est déjà sous forme hexa ) non plus de type caractere mais de type entier pour ensuite pouvoir connaitre sa valeur décimale avec sprintf( résultat, \"%d\", chaine ).

    En tout cas, merci pour ta réponse.

    Cako19

  4. #4
    Membre MP
    Inscrit
    août 2013
    Messages
    8
    Salut,

    voila une petite fonction qui devrait répondre à tes besoins.

    Code:
    #include <math.h>
    
    // Convertit une chaine au format hexa (0x00AAD22) en une valeur entière 
    long htoi(const char * szChaine)
    {
    	long lResult	= 0;
    	int iLength		= 0;
    
    	// Pointeur null, on renvoi -1
    	if (szChaine == NULL)
    		return -1;
    
    	// On calcule la longueur de la chaine
    	iLength = strlen(szChaine);
    
    	// Une chaine sous forme Hexa doit faire + de 2 caractères (0x.....)
    	if (iLength <= 2)
    		return -2;
    
    	// On met la chaine en majuscule dans une nouvelle chaine (allouée par strdup)
    	char * szHexaString = strdup(szChaine);
    
    	// Pour chaque caractère on calcule sa valeur
    	for (int i = iLength - 1; i >= 2; i--)
    	{
    		char cCharacter = szHexaString[i];
    		int iValue = 0;
    
    		// C\'est un digit, on le convertit en entier
    		if (isdigit(cCharacter))
    			iValue = atoi(&cCharacter);
    		// C\'est un caractère, on lui associe une valeur entière
    		else if (isalpha(cCharacter))	
    		{	
    			switch(cCharacter)
    			{
    				case \'A\' :	iValue = 10;
    							break;
    
    				case \'B\' :	iValue = 11;
    							break;
    
    				case \'C\' :	iValue = 12;
    							break;
    
    				case \'D\' :	iValue = 13;
    							break;
    
    				case \'E\' :	iValue = 14;
    							break;
    
    				case \'F\' :	iValue = 15;
    							break;
    
    				default  :	return -3;		// Caractère invalide en Hexa.
    			}
    		}
    		// Ce n\'est ni un caractère ni un digit.
    		else
    			return -4;   // Caractère non valide.
    
    		lResult += iValue * pow(16, iLength - i - 1);
    	}
    
    	// Libération de la chaine allouée
    	free (szHexaString);
    
    	return lResult;
    }
    A+

  5. #5
    Visiteur MP
    Visiteur MP
    Tiens voila une solution qui utilise le fait que 1 car en exa utilise 4 bit !
    - cette fonction ne traite pas les erreurs !
    => pour ceux, meme chose que chez wizard
    Code:
    #include <stdio.h>
    #define MASK 0x000000FF
    
    int ctoi(char* ptCar);
    int htoi(char* Chaine);
    
    int main(void)
    {
    int i=0;
    
    /*qui commence par 0x avec FFFF FFFF au max + \\0*/
    char chaineAconvertir[11];
    unsigned Resultat;
    
    scanf(\"%s\",chaineAconvertir);
    
    Resultat = htoi(chaineAconvertir);
    
    printf(\"%x\\n\",Resultat);
    
    sleep(5000);
    return 0;
    }
    
    
    int htoi(char* Chaine)
    {
    int i = 0;
    char* ptCar;
    int Resultat = 0;
    
    ptCar = strchr(Chaine,\'\\0\');
    ptCar = ptCar - 1;
    while (*ptCar != \'x\')
    {
        Resultat = ( (ctoi(ptCar) & (MASK )) << (4 * i) )|(Resultat);
        i = i + 1;
        ptCar = ptCar - 1;    
    }
    
    return Resultat;
    }
    
    
    int ctoi(char* ptCar)
    {
     int i = 0;
     int res;
      
     if (*ptCar > 57) /*A .. F (A = 65 en ASCII) et (A=10 en hexa)*/
     {
      *ptCar = *ptCar - (char)55;
     }
     else             /*0 .. 9 (0 = 48 en ASCII) et (0=0 en hexa)*/
     {
      *ptCar = *ptCar - (char)48;
     }
     res =  (0x00000000FF & *ptCar);
     
     return res;
    }

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé