src/hexdump.c

Wed, 05 Aug 2009 15:00:54 +0100

author
Philip Pemberton <philpem@philpem.me.uk>
date
Wed, 05 Aug 2009 15:00:54 +0100
changeset 12
96e1df9bd27c
parent 0
0eef8cf74b80
permissions
-rw-r--r--

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 }