2012-10-04 10 views
6

Czy istnieje krótsza forma drukowania ciąg w hex następnieOneliner do drukowania ciągów w hex?

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

Co sprawia, że ​​zadajesz to pytanie? –

+0

@TonyTheLion po prostu ciekawy – reox

Odpowiedz

18

Nie "oneliner", no. Poza tym twój kod wygląda na uszkodzony.

Nie można użyć takiego sizeof, prawdopodobnie oznacza to strlen().

I musisz rzucić znak na typ bez znaku, aby być bezpiecznym.

Tak, coś takiego, może:

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

Zauważ, że I NIE połączenia strlen(), ponieważ nie ma sensu iteracji nad ciągiem dwukrotnie po raz zrobi. :)

+0

'sizeof' może być w porządku, jeśli ma do czynienia z prostą tablicą, np. 'uint8_t string [] = {0x01, 0x02, 0x03};'. Jednakże mógłby on mieć jeden po drugim (pętle 'while' czytają zbyt wiele znaków) –

+0

@FrerichRaabe tak, mam tutaj uint8_t [] tutaj ... lepiej używaj' while (- c) ' w moim przypadku? ale potem \ 00 nie jest drukowane ... – reox

+0

@reox: Przepraszam, źle się domyśliłem. Miałem jeden przypadek w moim myśleniu, tak powiem ;-) Myślę, że 'while (c -') będzie dobrze. Jeśli jednak tablica ma zawsze wartość NUL, możesz równie dobrze nie używać zmiennej 'c', a raczej używać' while (* m) '. –

2

Myślę, że technicznie "ciąg" wprowadza w błąd; wydajesz się drukować tablicę (niekoniecznie zakończoną wartością NULL) o wartościach uint8_t.

W każdym przypadku potrzebujesz pętli. Jeśli można użyć C99, można napisać

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

Jeśli tablica jest zakończony zerem, i nie trzeba oryginalną wartość string (często jest to przypadek, kiedy przechodzącej przez wskaźnik wartość), możesz mieć

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