Wed, 05 Aug 2009 15:00:54 +0100
small changes to hexdump code to stop a gcc warning on platforms where sizeof(int) != sizeof(int*) e.g. x86_64
1 #include <stdio.h>
2 #include <ctype.h>
3 #include <string.h>
5 void hex_dump(void *data, int size)
6 {
7 /* dumps size bytes of *data to stdout. Looks like:
8 * [0000] 75 6E 6B 6E 6F 77 6E 20
9 * 30 FF 00 00 00 00 39 00 unknown 0.....9.
10 * (in a single line of course)
11 */
13 unsigned char *p = data;
14 unsigned long addr = 0;
15 unsigned char c;
16 int n;
17 char bytestr[4] = {0};
18 char addrstr[10] = {0};
19 char hexstr[ 16*3 + 5] = {0};
20 char charstr[16*1 + 5] = {0};
21 for(n=1;n<=size;n++) {
22 if (n%16 == 1) {
23 /* store address for this line */
24 snprintf(addrstr, sizeof(addrstr), "%.4lX",
25 addr);
26 }
28 c = *p;
29 if (isalnum(c) == 0) {
30 c = '.';
31 }
33 /* store hex str (for left side) */
34 snprintf(bytestr, sizeof(bytestr), "%02X ", *p);
35 strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1);
37 /* store char str (for right side) */
38 snprintf(bytestr, sizeof(bytestr), "%c", c);
39 strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1);
41 if(n%16 == 0) {
42 /* line completed */
43 printf("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
44 hexstr[0] = 0;
45 charstr[0] = 0;
46 } else if(n%8 == 0) {
47 /* half line: add whitespaces */
48 strncat(hexstr, " ", sizeof(hexstr)-strlen(hexstr)-1);
49 strncat(charstr, " ", sizeof(charstr)-strlen(charstr)-1);
50 }
51 p++; /* next byte */
52 addr++; /* increment address */
53 }
55 if (strlen(hexstr) > 0) {
56 /* print rest of buffer if not empty */
57 printf("[%4.4s] %-50.50s %s\n", addrstr, hexstr, charstr);
58 }
59 }