2012-04-29 19 views
9

Tengo una matriz de 8 bytes para la que estoy tratando de imprimir la notación hexadecimal. Utilizando printf("%x", array) puedo obtener el primer byte e imprimirlo, pero obtengo "0xffffff9b" o algo por el estilo. ¿Hay alguna manera de obtener la notación sin las "f"?Imprimir la representación hexadecimal de una matriz char []

quisiera imprimir cada elemento buscando algo como:

0x9a, 0x43, 0x0D, etc.

+5

Haga que su matriz escriba 'unsigned char []' en lugar de 'char []'. –

+0

http://stackoverflow.com/questions/6357031/how-do-you-convert-buffer-byte-array-to-hex-string-in-c –

Respuesta

16

Este:

printf("%x", array); 

lo más probable es imprimir la direccióndel primer elemento de su matriz en hexadecimal Digo "muy probablemente" porque el comportamiento de intentar imprimir una dirección como si fuera unsigned int no está definido. Si realmente desea imprimir la dirección, la forma correcta de hacerlo sería:

printf("%p", (void*)array); 

(Una expresión de matriz, en la mayoría de los contextos, se convierte implícitamente a ("decae" a) un puntero a la matriz de primera elemento.)

Si desea imprimir cada elemento de su matriz, tendrá que hacerlo explícitamente. El formato "%s" toma un puntero al primer carácter de una cadena y dice printf para iterar sobre la cadena, imprimiendo cada carácter. No hay un formato que haga ese tipo de cosas en hexadecimal, por lo que tendrá que hacerlo usted mismo.

Por ejemplo, dado:

unsigned char arr[8]; 

puede imprimir el elemento 5 de esta manera:

printf("0x%x", arr[5]); 

o, si quieres un cero a la izquierda:

printf("0x%02x", arr[5]); 

El formato "%x" requiere un argumento de unsigned int, y el valor de unsigned char es aprobado ing es implícitamente promovido a unsigned int, por lo que es correcto. Puede usar "%x" para imprimir los dígitos hexadecimales a a través de f en minúsculas, "%X" para mayúsculas (utilizó ambos en su ejemplo).

(Tenga en cuenta que el formato "0x%02x" funciona mejor si los bytes son 8 bits, esto no está garantizado, pero es casi seguro que el caso en cualquier sistema es muy probable que utilice.)

lo dejo a usted escribir el ciclo apropiado y decidir cómo delimitar el resultado.

4

Esto es lo que hice, es un poco más fácil con una función y la utilizo para depurar y registrar la memoria.

void print_hex_memory(void *mem) { 
    int i; 
    unsigned char *p = (unsigned char *)mem; 
    for (i=0;i<128;i++) { 
    printf("0x%02x ", p[i]); 
    if ((i%16==0) && i) 
     printf("\n"); 
    } 
    printf("\n"); 
} 
+0

Use "if (i% 16 == 0 && i) "para no romper la línea en la primera impresión. – lsalamon

+0

¡Gran sugerencia! Gracias. – Andy

Cuestiones relacionadas