2012-10-04 9 views
6

non v'è alcuna forma più breve per la stampa di una stringa in esadecimale poiOneliner per stampare una stringa in esadecimale?

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

Cosa ti fa fare questa domanda? –

+0

@TonyTheLion solo curioso – reox

risposta

18

No "oneliner", no. Inoltre, il tuo codice sembra rotto.

Non è possibile utilizzare sizeof in questo modo, probabilmente si intende strlen().

Ed è necessario trasmettere il carattere a un tipo senza segno per sicurezza.

Quindi, qualcosa di simile, forse:

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

Nota che Non chiamata strlen(), dal momento che non c'è nessun punto nel iterazione sopra la stringa due volte quando una volta lo farà. :)

+0

'sizeof' può andare bene se ha a che fare con un array semplice, ad es. 'uint8_t string [] = {0x01, 0x02, 0x03};'. Tuttavia, il suo potrebbe avere un carattere off-by-one (i cicli 'while' leggono troppo un carattere.) –

+0

@FrerichRaabe si ho un uint8_t [] qui ... meglio usare' while (- c) ' nel mio caso? ma poi il \ 00 non viene stampato ... – reox

+0

@reox: Scusa, ho sbagliato. Avevo un fuori-da-uno nel mio modo di pensare, per così dire ;-) Penso 'while (c -') andrebbe bene. Tuttavia, se la matrice è sempre terminata con null, si potrebbe anche non usare la variabile 'c', ma piuttosto usare' while (* m) '. –

2

Penso che tecnicamente "stringa" sia fuorviante qui; sembra che stiate stampando un array (non necessariamente a terminazione nulla) dei valori uint8_t.

Avrete bisogno di un ciclo in ogni caso. Se è possibile utilizzare C99, si potrebbe scrivere

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

Se la matrice è terminazione Null, e non c'è bisogno il valore originale di string (questo è spesso il caso quando si passa il puntatore valore), potresti avere

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