¿Cómo puedo convertir un entero a una cadena hexadecimal en C?

¿Cómo puedo convertir un entero a una cadena hexadecimal en C?

Ejemplo: El entero 50 se convertiría a la cadena hexadecimal "32" o "0x32" .

Este código

 int a = 5; printf("%x\n", a); 

huellas dactilares

 5 

Este código

 int a = 5; printf("0x%x\n", a); 

huellas dactilares

 0x5 

Este código

 int a = 89778116; printf("%x\n", a); 

huellas dactilares

 559e7c4 

Si capitaliza la x en el formato, escribe en mayúscula el valor hexadecimal:

 int a = 89778116; printf("%X\n", a); 

huellas dactilares

 559E7C4 

Si desea imprimir punteros, utilice el especificador de formato p:

 char* str = "foo"; printf("0x%p\n", str); 

huellas dactilares

 0x01275744 

Usualmente con printf (o uno de sus primos) usando el especificador de formato %x .

El siguiente código toma un número entero y crea una cadena en formato hexadecimal:

 int num = 32424; char hex[5]; sprintf(hex, "%x", num); puts(hex); 

da

 7ea8 

Es interesante que estas respuestas utilicen printf como si fuera un hecho. printf convierte el entero en un valor de cadena hexadecimal.

 //************************************************************* // void prntnum(unsigned long n, int base, char sign, char *outbuf) // unsigned long num = number to be printed // int base = number base for conversion; decimal=10,hex=16 // char sign = signed or unsigned output // char *outbuf = buffer to hold the output number //************************************************************* void prntnum(unsigned long n, int base, char sign, char *outbuf) { int i = 12; int j = 0; do{ outbuf[i] = "0123456789ABCDEF"[num % base]; i--; n = num/base; }while( num > 0); if(sign != ' '){ outbuf[0] = sign; ++j; } while( ++i < 13){ outbuf[j++] = outbuf[i]; } outbuf[j] = 0; } 

Hice una librairy para hacer conversión Hexadecimal / Decimal sin el uso de stdio.h . Muy simple de usar:

 char* dechex (int dec); 

Esto usará calloc() para devolver un puntero a una cadena hexadecimal, de esta manera la cantidad de memoria utilizada se optimiza, así que no olvides usar free()

Aquí el enlace en github: https://github.com/kevmuret/libhex/

Convertir un entero a una cadena también involucra una matriz de caracteres o administración de memoria.

Para manejar esa parte para tales matrices cortas, el código podría usar un literal compuesto , desde C99, para crear un espacio de matriz, sobre la marcha . La cadena es válida hasta el final del bloque.

 #define UNS_HEX_STR_SIZE ((sizeof (unsigned)*CHAR_BIT + 3)/4 + 1) // compound literal v--------------------------v #define U2HS(x) unsigned_to_hex_string((x), (char[UNS_HEX_STR_SIZE]) {0}, UNS_HEX_STR_SIZE) char *unsigned_to_hex_string(unsigned x, char *dest, size_t size) { snprintf(dest, size, "%X", x); return dest; } int main(void) { // 3 array are formed vvv printf("%s %s %s\n", U2HS(UINT_MAX), U2HS(0), U2HS(0x12345678)); char *hs = U2HS(rand()); puts(hs); // `hs` is valid until the end of the block } 

Salida

 FFFFFFFF 0 12345678 5851F42D