2012-04-29 10 views
9

Ho una matrice di 8 byte per cui sto cercando di stampare la notazione esadecimale per. Utilizzo di printf("%x", array) Posso ottenere il primo byte e stamparlo ma sto ricevendo "0xffffff9b" o qualcosa del genere. C'è un modo per ottenere la notazione senza le "f"?Stampa della rappresentazione esadecimale di un array di caratteri []

Vorrei stampare ogni elemento che assomiglia a:

0x9a, 0x43, 0x0D, ecc

+5

Fai il tuo tipo di matrice 'unsigned char []' piuttosto che 'char []'. –

+0

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

risposta

16

questo:

printf("%x", array); 

molto probabilmente stampare l'indirizzo del primo elemento di il tuo array in esadecimale. Dico "molto probabilmente" perché il comportamento del tentativo di stampare un indirizzo come se fosse un unsigned int non è definito. Se si voleva davvero per stampare l'indirizzo, il modo giusto per farlo sarebbe:

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

(Un'espressione array, nella maggior parte dei contesti, viene convertito in modo implicito ("decade" per) un puntatore alla matrice del primo elemento.)

Se si desidera stampare ogni elemento dell'array, è necessario farlo in modo esplicito. Il formato "%s" prende un puntatore al primo carattere di una stringa e dice a printf di scorrere la stringa, stampando ogni carattere. Non esiste un formato che faccia quel tipo di cosa in esadecimale, quindi dovrai farlo tu stesso.

Ad esempio, dato:

unsigned char arr[8]; 

è possibile stampare elemento 5 in questo modo:

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

o, se si desidera uno zero:

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

Il formato "%x" richiede un argomento unsigned int e il valore unsigned char ti passa ing è implicitamente promosso a a unsigned int, quindi è corretto sul tipo. È possibile utilizzare "%x" per stampare le cifre esadecimali a tramite f in lettere minuscole, "%X" per lettere maiuscole (è stato utilizzato entrambi nell'esempio).

(Si noti che il formato "0x%02x" funziona meglio se i byte sono 8 bit, che non è garantito, ma è quasi certamente il caso su qualsiasi sistema è molto probabile che l'uso.)

Lascio a voi scrivere il ciclo appropriato e decidere come delimitare l'output.

4

Questo è quello che ho fatto, è un po 'più semplice con una funzione e io uso per il debug e la registrazione della 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

Utilizza "if (i% 16 == 0 && i) "per non interrompere la linea alla prima stampa. – lsalamon

+0

Ottimo suggerimento! Grazie. – Andy

Problemi correlati