2012-04-29 12 views
9

Mam tablicę 8 bajtów, dla których próbuję wydrukować notację szesnastkową. Korzystając z printf("%x", array) mogę uzyskać pierwszy bajt i wydrukować go, ale otrzymuję "0xffffff9b" lub coś w tym rodzaju. Czy istnieje sposób na uzyskanie zapisu bez "f"?Drukowanie szesnastkowej reprezentacji tablicy znaków []

chciałbym wydrukować każdy element szuka coś takiego:

0x9a, 0x43, 0x0D itd

+5

Utwórz tablicę typu 'unsigned char []' zamiast 'char []'. –

+0

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

Odpowiedz

16

to:

printf("%x", array); 

najprawdopodobniej wydrukować adres pierwszego elementu twoja tablica w systemie szesnastkowym. Mówię "najprawdopodobniej", ponieważ zachowanie próby drukowania adresu tak, jakby był to unsigned int, jest niezdefiniowane. Jeśli naprawdę chciał wydrukować adres właściwy sposób to zrobić byłoby:

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

(Wyrażenie tablicą, w większości kontekstów, jest niejawnie konwertowane do („rozpada się” do) wskaźnik do tablicy najpierw element.)

Jeśli chcesz wydrukować każdy element swojej tablicy, musisz to zrobić jawnie. Format "%s" przyjmuje wskaźnik do pierwszego znaku ciągu i mówi printf, aby powtórzył ciąg znaków, drukując każdy znak. Nie ma żadnego formatu, który robi tego rodzaju rzeczy w systemie szesnastkowym, więc musisz to zrobić sam.

Na przykład, biorąc pod uwagę:

unsigned char arr[8]; 

można wydrukować elementu 5 tak:

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

lub, jeśli chcesz zerem:

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

Format

"%x" wymaga argumentu unsigned int i wartości, którą przechodzisz ing jest domyślnie promowany do unsigned int, więc jest to poprawne. Można użyć wartości "%x", aby wydrukować cyfry heksadecymalne a do f małymi literami, "%X" dla dużych liter (używane w obu przykładach).

(Zauważ, że format, "0x%02x" działa najlepiej jeśli bajtów 8 bitów, to nie ma gwarancji, ale jest to prawie na pewno przypadek na każdym systemie najprawdopodobniej w użyciu.)

Zostawię je do Ciebie napisać odpowiednią pętlę i zdecydować, jak ograniczyć wyjście.

4

To jest to, co zrobiłem, nieco łatwiej z funkcją i używam do debugowania i rejestrowania pamięci.

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

Użyj "if (i% 16 == 0 && i) "aby nie złamać wiersza przy pierwszym wydruku. – lsalamon

+0

Świetna propozycja! Dzięki. – Andy