Download | Plain Text | Line Numbers
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void hex_dump(void *data, int size)
{
/* dumps size bytes of *data to stdout. Looks like:
* [0000] 75 6E 6B 6E 6F 77 6E 20
* 30 FF 00 00 00 00 39 00 unknown 0.....9.
* (in a single line of course)
*/
unsigned char *p = data;
unsigned char c;
int n;
char bytestr[20] = {0};
char addrstr[10] = {0};
char hexstr[ 16*3 + 5 + 20] = {0};
char charstr[16*1 + 5] = {0};
for (n=1;n<=size;n++)
{
if (n%8 == 1)
{
/* store address for this line */
snprintf(addrstr, sizeof(addrstr), "%.4x",
((unsigned int)p-(unsigned int)data) );
}
c = *p;
if (isalnum(c) == 0)
c = '.';
/* store hex str (for left side) */
snprintf(bytestr, sizeof(bytestr), "0x%02x ", *p);
strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1);
/* store char str (for right side) */
snprintf(bytestr, sizeof(bytestr), "%c", c);
strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1);
if (n%8 == 0)
{
/* line completed */
fprintf(stderr, "[%4.4s] %-65.65s %s\n", addrstr, hexstr, charstr);
hexstr[0] = 0;
charstr[0] = 0;
}
else if (n%8 == 0)
{
/* half line: add whitespaces */
strncat(hexstr, " ", sizeof(hexstr)-strlen(hexstr)-1);
strncat(charstr, " ", sizeof(charstr)-strlen(charstr)-1);
}
p++; /* next byte */
}
if (strlen(hexstr) > 0)
{
/* print rest of buffer if not empty */
fprintf(stderr, "[%4.4s] %-65.65s %s\n", addrstr, hexstr, charstr);
}
}