2012-10-04 36 views
6

¿Hay alguna forma más corta para la impresión de una cadena en hexadecimal continuaciónOneliner para imprimir una cadena en hexadecimal?

uint8_t *m = string; 
int c = sizeof(string); 
while(c--){ 
    printf("%02x ", *(m++)); 
} 
+0

¿Qué te hace esta pregunta? –

+0

@TonyTheLion solo curioso – reox

Respuesta

18

No "oneliner", no. Además, tu código parece roto.

No puede usar sizeof así, probablemente se refiera a strlen().

Y necesita convertir el personaje en un tipo sin firmar para estar seguro.

Por lo tanto, algo así, tal vez:

void print_hex(const char *s) 
{ 
    while(*s) 
    printf("%02x", (unsigned int) *s++); 
    printf("\n"); 
} 

Nota que No llamada strlen(), ya que no hay ningún punto en la iteración en la cadena dos veces cuando una vez es suficiente. :)

+0

'sizeof' puede estar bien si se trata de una matriz simple, p. 'uint8_t string [] = {0x01, 0x02, 0x03};'. Sin embargo, su podría tener un "off-by-one" (los bucles 'while' leen demasiado a un personaje. –

+0

@FrerichRaabe sí, tengo un uint8_t [] aquí ... mejor uso' while (- c) ' en mi caso? pero luego el \ 00 no está impreso ... – reox

+0

@reox: Lo siento, lo he contado mal. Tuve un punto a punto en mi pensamiento, por así decirlo ;-) Creo que 'while (c -') estaría bien. Sin embargo, si la matriz es siempre terminada en nulo, es mejor que no uses la variable 'c', sino que simplemente uses' while (* m) '. –

2

Creo que técnicamente "cadena" es engañosa aquí; parece que está imprimiendo una matriz (no necesariamente terminada en nulo) de uint8_t valores.

Necesitará un bucle en cualquier caso. Si se puede usar C99, se podría escribir

for (size_t i = 0; i < sizeof(string); ++i) printf("%02x", string[i]); 

Si la matriz es terminada en nulo, y no necesitan que el valor original de string (esto es a menudo un caso al pasar el puntero por valor), puede tener

static void printArray(const uint8_t *string) 
{ 
    while (*string) printf("%02x", *string++); 
} 
Cuestiones relacionadas