99 votes

Convertir la chaîne hexadécimale (char []) en int ?

J'ai un caractère[] qui contient une valeur telle que "0x1800785" mais la fonction à laquelle je veux donner la valeur nécessite un int, comment puis-je convertir cela en int ? J'ai fait des recherches, mais je n'ai pas trouvé de réponse.

26voto

radhoo Points 1185

Ou si vous voulez avoir votre propre implémentation, j'ai écrit cette fonction rapide comme exemple :

/**
 * hex2int
 * take a hex string and convert it to a 32bit number (max 8 hex digits)
 */
uint32_t hex2int(char *hex) {
    uint32_t val = 0;
    while (*hex) {
        // get current character then increment
        uint8_t byte = *hex++; 
        // transform hex character to the 4bit equivalent number, using the ascii table indexes
        if (byte >= '0' && byte <= '9') byte = byte - '0';
        else if (byte >= 'a' && byte <='f') byte = byte - 'a' + 10;
        else if (byte >= 'A' && byte <='F') byte = byte - 'A' + 10;    
        // shift 4 to make space for new digit, and add the 4 bits of the new digit 
        val = (val << 4) | (byte & 0xF);
    }
    return val;
}

25voto

holly Points 181

Quelque chose comme ça pourrait être utile :

char str[] = "0x1800785";
int num;

sscanf(str, "%x", &num);
printf("0x%x %i\n", num, num); 

Lire man sscanf

11voto

James McLaughlin Points 11924

En supposant que tu veuilles dire que c'est une corde, que dirais-tu de Strtol ?

10voto

LimeRed Points 565

Utilisez strtol si vous avez libc disponible comme le suggère la première réponse. Cependant, si vous aimez les choses personnalisées ou si vous êtes sur un microcontrôleur sans libc ou ainsi, vous pouvez vouloir une version légèrement optimisée sans branchement complexe.

#include <inttypes.h>


/**
 * xtou64
 * Take a hex string and convert it to a 64bit number (max 16 hex digits).
 * The string must only contain digits and valid hex characters.
 */
uint64_t xtou64(const char *str)
{
    uint64_t res = 0;
    char c;

    while ((c = *str++)) {
        char v = (c & 0xF) + (c >> 6) | ((c >> 3) & 0x8);
        res = (res << 4) | (uint64_t) v;
    }

    return res;
} 

La magie du décalage de bits se résume à : Il suffit d'utiliser les 4 derniers bits, mais s'il s'agit d'un chiffre non, ajoutez également 9.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X