tabla - hexadecimal online
cómo convertir una cadena hexadecimal a un entero sin signo de 64 bits(uint64_t) de una manera rápida y segura? (3)
Lo intenté
sscanf(str, "%016llX", &int64 );
pero parece no ser seguro. ¿Hay una manera rápida y segura de hacer el tipo de casting?
Gracias ~
En el momento en que escribí esta respuesta, tu título sugería que querías escribir un int64_t en una cadena, mientras que tu código hacía lo contrario (leyendo una cadena hexadecimal en un int64_t). Respondí "en ambos sentidos":
El <inttypes.h>
tiene macros de conversión para manejar los tipos ..._t
forma segura:
#include <stdio.h>
#include <inttypes.h>
sprintf( str, "%016" PRIX64, int64 );
O (si eso es lo que estás intentando hacer), al revés:
#include <stdio.h>
#include <inttypes.h>
sscanf( str, "%" SCNx64, &int64 );
Tenga en cuenta que no puede imponer anchos, etc. con la familia de funciones scanf()
. Analiza lo que obtiene, lo que puede generar resultados no deseados cuando la entrada no se ajusta al formato esperado. Ah, y la familia de funciones scanf()
solo conoce (minúsculas) "x", no (mayúsculas) "X".
No se moleste con las funciones de la familia scanf
. Son casi imposibles de usar de forma robusta. Aquí hay un uso general seguro de strtoull
:
char *str, *end;
unsigned long long result;
errno = 0;
result = strtoull(str, &end, 16);
if (result == 0 && end == str) {
/* str was not a number */
} else if (result == ULLONG_MAX && errno) {
/* the value of str does not fit in unsigned long long */
} else if (*end) {
/* str began with a number but has junk left over at the end */
}
Tenga en cuenta que strtoull
acepta un prefijo 0x
opcional en la cadena, así como espacios en blanco iniciales opcionales y un carácter de signo ( +
o -
). Si desea rechazar estos, debe realizar una prueba antes de llamar a strtoull
, por ejemplo:
if (!isxdigit(str[0]) || (str[1] && !isxdigit(str[1])))
Si también desea rechazar representaciones de números excesivamente largos (ceros a la izquierda), puede verificar la siguiente condición antes de llamar a strtoull
:
if (str[0]==''0'' && str[1])
Una cosa más a tener en cuenta es que los "números negativos" no se consideran fuera del rango de conversión; en su lugar, un prefijo de -
se trata igual que el operador de negación unaria en C aplicado a un valor sin signo, por lo que strtoull("-2", 0, 16)
devolverá ULLONG_MAX-1
(sin establecer errno
).
Su título (en la actualidad) contradice el código que proporcionó. Si quieres hacer lo que originalmente era tu título (convertir una cadena en un entero), entonces puedes usar esta respuesta.
Puede usar la función strtoull
, que a diferencia de sscanf
es una función específicamente orientada a leer representaciones textuales de números.
const char *test = "123456789abcdef0";
errno = 0;
unsigned long long result = strtoull(test, NULL, 16);
if (errno == EINVAL)
{
// not a valid number
}
else if (errno == ERANGE)
{
// does not fit in an unsigned long long
}