2012-08-16 7 views
7

Ho una struttura, un puntatore a una struttura e desidero stampare i primi n byte come un numero esadecimale lungo o una stringa di byte esadecimali.Stampa dati grezzi su un'uscita esadecimale a lunghezza fissa

Essenzialmente ho bisogno dell'equivalente printf del comando di memoria di esaminare gdb, x/nxb.

Se possibile, desidero continuare a utilizzare printf poiché la funzione di registrazione del programma ne ha solo una variante. Ancora meglio se posso farlo senza dover scorrere i dati.

risposta

7

appena preso il consiglio di Eric Postpischil e cucinato il seguente:

struct mystruc 
{ 
    int a; 
    char b; 
    float c; 
}; 

int main(int argc, char** argv) 
{ 
    struct mystruc structVar={5,'a',3.9}; 
    struct mystruc* strucPtr=&structVar; 
    unsigned char* charPtr=(unsigned char*)strucPtr; 
    int i; 
    printf("structure size : %zu bytes\n",sizeof(struct mystruc)); 
    for(i=0;i<sizeof(struct mystruc);i++) 
     printf("%02x ",charPtr[i]); 

    return 0; 
} 

stamperà i byte come fas come i tratti della struttura.

Aggiornamento: Grazie per l'intuizione Eric :) Ho aggiornato il codice.

+2

Le dimensioni devono essere stampate con "% zu". Questo è il formato per il tipo 'size_t' senza segno, che può differire dal tipo' int' firmato che è "% d" per. E potrebbe essere preferibile stampare byte con "% 02x" anziché "% x". Quest'ultimo stampa solo una cifra se il valore è abbastanza piccolo. –

1

Prova questo. Supponiamo che tu abbia un puntatore da struct in pstruct.

unsigned long long *aslong = (unsigned long long *)pstruct; 
printf("%08x%08x%08x%08x%08x%08x%08x%08x", 
     aslong[0], 
     aslong[1], 
     aslong[2], 
     aslong[3], 
     aslong[4], 
     aslong[5], 
     aslong[6], 
     aslong[7], 
); 

Come Eric sottolinea, questo potrebbe stampare i byte fuori ordine. Quindi è o questo, o usando unsigned char * e (con un printf con 64 argomenti o utilizzando un ciclo).

+3

Questo dovrebbe usare il 'carattere non firmato '. 'char' può essere firmato, nel qual caso la promozione a' int' che si verifica quando si passa a printf causerà valori negativi come valori negativi a 32 bit. Ad esempio, il byte 0xff verrà stampato come "ffffffff". Inoltre, "% 02x" è un formato migliore da utilizzare, in quanto è probabile che tu desideri zeri iniziali anziché spazi. –

+0

Il problema con questa soluzione è che ho bisogno di stampare 64 byte, anziché 3. – rhlee

+0

@EricPostpischil: grazie per i commenti. unsigned è davvero la strada da percorrere, e '0' pure. – Claudiu

Problemi correlati