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.
Réponses
Trop de publicités?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;
}
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
En supposant que tu veuilles dire que c'est une corde, que dirais-tu de Strtol ?
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.