2010-04-29 35 views
5

EDITAR MASIVO:C - Convierte long int a cadena hexadecimal firmado

Tengo una variable int tiempo que necesito para convertir a una cadena de 24 bits hexadecimal con signo sin el "0 x" en la salida. La cadena debe tener 6 caracteres seguidos por un terminador de cadena '\ 0', por lo que se deben agregar ceros iniciales.

Ejemplos: [-1 -> FFFFFF] --- [1 -> 000001] --- [71 -> 000047]

respuesta Esto parece hacer el truco:

long int number = 37; 
char string[7]; 

snprintf (string, 7, "%lX", number); 
+0

Solo para aclaración, ¿a qué se refiere con hex firmado, p. ¿a qué debería convertirse -1? –

+0

FFFFFF (si he hecho mi conversión correcta): s) – Cheetah

+0

OK, que se ve como la conversión a largo sin firmar e imprime un número hexadecimal sin signo. –

Respuesta

8

Como solo quiere seis dígitos, probablemente deba hacer un poco de enmascaramiento para asegurarse de que el número sea el que necesita. Algo como esto:

sprintf(buffer, "%06lx", (unsigned long)val & 0xFFFFFFUL); 

Tenga en cuenta que está mapeando todos los enteros largos en una pequeña gama de representaciones. Es posible que desee verificar que el número se encuentre dentro de un rango específico antes de imprimirlo (por ejemplo, -2^23 < x < 2^23 - 1)

+1

Esta es la única respuesta * completa * en este momento (se requiere la conversión a 'unsigned long'). – caf

+0

¿Qué determina qué asignación anexar? Digamos que estaba buscando una cadena de 32 bits (8 caracteres), ¿qué mapa agregaría entonces?(Obviamente, también cambiaría los indicadores de formato a 08) – Cheetah

+0

Efectivamente, la asignación es x -> x (mod 2^24), por lo que los números> 2^24 se envuelven. Con una cadena de ocho caracteres y 32 bits, sería x -> x (mod. 2^32) si esto es una inyección (reversible) depende de qué tan grande sea el largo sin signo en la plataforma en cuestión. –

1

Use itoa. Toma la base deseada como argumento.

O, pensándolo bien, no. Use sprintf, que es estándar-obediente.

11

Mire sprintf. El especificador %lx hace lo que quiere.

+2

Además, debe usar 'snprintf' en lugar de' sprintf' si puede. – dreamlax

1

En el título diga que quiere una cadena hexagonal con signo, pero todos sus ejemplos son cadenas hexagonales sin signo. Suponiendo que los ejemplos son los que desea, la forma más fácil es

sprintf(buffer, "%06X", (int)value & 0xffffff);