72 lines
1.6 KiB
C
72 lines
1.6 KiB
C
// XXX: Taken from the wonderful https://stackoverflow.com/a/7776146
|
|
|
|
#include <stdio.h>
|
|
|
|
void hexDump (
|
|
const char * desc,
|
|
const void * addr,
|
|
const int len,
|
|
int perLine
|
|
) {
|
|
// Silently ignore silly per-line values.
|
|
|
|
if (perLine < 4 || perLine > 64) perLine = 16;
|
|
|
|
int i;
|
|
unsigned char buff[perLine+1];
|
|
const unsigned char * pc = (const unsigned char *)addr;
|
|
|
|
// Output description if given.
|
|
|
|
if (desc != NULL) printf ("%s:\n", desc);
|
|
|
|
// Length checks.
|
|
|
|
if (len == 0) {
|
|
printf(" ZERO LENGTH\n");
|
|
return;
|
|
}
|
|
if (len < 0) {
|
|
printf(" NEGATIVE LENGTH: %d\n", len);
|
|
return;
|
|
}
|
|
|
|
// Process every byte in the data.
|
|
|
|
for (i = 0; i < len; i++) {
|
|
// Multiple of perLine means new or first line (with line offset).
|
|
|
|
if ((i % perLine) == 0) {
|
|
// Only print previous-line ASCII buffer for lines beyond first.
|
|
|
|
if (i != 0) printf (" %s\n", buff);
|
|
|
|
// Output the offset of current line.
|
|
|
|
printf (" %04x ", i);
|
|
}
|
|
|
|
// Now the hex code for the specific character.
|
|
|
|
printf (" %02x", pc[i]);
|
|
|
|
// And buffer a printable ASCII character for later.
|
|
|
|
if ((pc[i] < 0x20) || (pc[i] > 0x7e)) // isprint() may be better.
|
|
buff[i % perLine] = '.';
|
|
else
|
|
buff[i % perLine] = pc[i];
|
|
buff[(i % perLine) + 1] = '\0';
|
|
}
|
|
|
|
// Pad out last line if not exactly perLine characters.
|
|
|
|
while ((i % perLine) != 0) {
|
|
printf (" ");
|
|
i++;
|
|
}
|
|
|
|
// And print the final ASCII buffer.
|
|
|
|
printf (" %s\n", buff);
|
|
}
|