C/Hex Dump

From Attie's Wiki
(Difference between revisions)
Jump to: navigation, search
m
m
Line 2: Line 2:
  
 
<source lang="c">
 
<source lang="c">
#define HEX_DUMP_WIDTH 16
+
void hex_dump(void *data, size_t len, int width) {
 
+
int i;
int i;
+
char row[64];
char row[HEX_DUMP_WIDTH];
+
uint8_t *d = data;
 
+
for (i = 0; i < bufferLen; i++) {
+
if (data == NULL || len == 0) return;
if (i % HEX_DUMP_WIDTH == 0) {
+
printf("0x%04X:", i);
+
if (width < 1) {
 +
width = 1;
 +
} else if (width > sizeof(row)) {
 +
width = sizeof(row);
 
}
 
}
row[i % HEX_DUMP_WIDTH] = (buffer[i] >= ' ' && buffer[i] <= '~' ? buffer[i] : '.');
+
printf(" %02X", buffer[i]);
+
for (i = 0; i < len; i++) {
if (i % HEX_DUMP_WIDTH == HEX_DUMP_WIDTH - 1) {
+
if (i % width == 0) {
printf(" | %*s\n", HEX_DUMP_WIDTH, row);
+
printf("0x%04X:", i);
 +
}
 +
row[i % width] = (d[i] >= ' ' && d[i] <= '~' ? d[i] : '.');
 +
printf(" %02X", d[i]);
 +
if (i % width == width - 1) {
 +
printf(" | %.*s\n", width, row);
 +
}
 
}
 
}
}
+
if (i % width != 0) {
if (i % 16 != 0) {
+
for (; i % width != 0; i++) {
for (; i % HEX_DUMP_WIDTH != 0; i++) {
+
printf(" --");
printf(" --");
+
row[i % width] = ' ';
row[i % HEX_DUMP_WIDTH] = ' ';
+
}
 +
printf(" | %.*s\n", width, row);
 
}
 
}
printf(" | %16s\n", row);
+
}  
}
+
 
</source>
 
</source>
  

Revision as of 11:21, 25 October 2013

The following code will dump buffer that is bufferLen bytes long.

void hex_dump(void *data, size_t len, int width) {
	int i;
	char row[64];
	uint8_t *d = data;
 
	if (data == NULL || len == 0) return;
 
	if (width < 1) {
		width = 1;
	} else if (width > sizeof(row)) {
		width = sizeof(row);
	}
 
	for (i = 0; i < len; i++) {
		if (i % width == 0) {
			printf("0x%04X:", i);
		}
		row[i % width] = (d[i] >= ' ' && d[i] <= '~' ? d[i] : '.');
		printf(" %02X", d[i]);
		if (i % width == width - 1) {
			printf(" | %.*s\n", width, row);
		}
	}
	if (i % width != 0) {
		for (; i % width != 0; i++) {
			printf(" --");
			row[i % width] = ' ';
		}
		printf(" | %.*s\n", width, row);
	}
}

The output will look like this:

0x0000: E2 80 B9 45 C3 BF 75 C3 A4 C3 BF 75 C3 BC E2 80 | ...E..u....u....
0x0010: B0 30 E2 80 B9 45 E2 80 B0 38 C3 BF 40 41 C3 BF | .0...E...8..@A..
0x0020: 75 C3 BC C3 BF 75 C3 BF C3 A8 42 41 E2 80 B9 C3 | u....u....BA....
0x0030: 87 5F 5E C3 89 C3 83 55 E2 80 B9 C3 AC C6 92 C3 | ._^....U........
0x0040: AC 64 E2 80 B9 45 48 74 54 2D E2 80 B9 45 75 C6 | .d...EHtT-...Eu.
0x0050: 92 C3 B8 74 37 C6 92 C3 B8 74 C6 92 C3 B8 76 C6 | ...t7....t....v.
0x0060: 92 C3 B8 76 28 C3 BF 75 50 C3 BF 75 C3 BF 75 C3 | ...v(..uP..u..u.
0x0070: A8 28 C3 A7 C3 BF C3 BF C3 A9 E2 84 A2 6A C3 BF | .(...........j..
0x0080: 75 C3 BF C3 B0 42 41 66 3D C3 BF 74 0A C2 B7 C3 | u....BAf=..t....
0x0090: 80 50 C3 BF 20 43 41 33 C3 80 C3 A9 77 E2 80 B9 | .P.. CA3....w...
0x00A0: 45 53 56 33 C3 9B E2 80 B9 57 E2 80 B0 45 C3 A4 | ESV3.....W...E..
0x00B0: E2 80 B0 5D E2 80 B9 E2 80 B9 50 66 E2 80 B9 40 | ...]......Pf...@
0x00C0: E2 80 B0 4D C3 98 C2 B7 C3 B0 E2 80 B0 45 C3 AC | ...M.........E..
0x00D0: E2 80 B9 C3 86 C6 92 C3 A0 E2 80 B0 55 C3 A8 2B | ............U..+
0x00E0: C3 83 C3 87 45 C3 BC C3 BF E2 80 9E 36 6A 48 59 | ....E.......6jHY
0x00F0: E2 80 9E 2B C3 81 E2 80 9E C3 8B 48 E2 80 9E C5 | ...+.......H....
0x0100: BE 2B C3 81 74 50 48 74 35 48 E2 80 A6 25 C2 A1 | .+..tPHt5H...%..
0x0110: C3 80 43 E2 80 B0 4D C2 8D CB 86 63 C2 81 E2 80 | ..C...M....c....
0x0120: B0 4D C2 BC E2 80 B0 45 C3 80 66 C3 -- -- -- -- | .M.....E..f.
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox