Hex dump functions
This post starts a new category of posts called Code library. In this category I will post useful code snippets. I hope you’ll find them as useful as I do.
I use two functions below quiet often. Both functions do hexadecimal dump of given buffer. First function is in C. Second function is in Python. Enjoy.
void hex_dump(char *data, int size, char *caption)
{
int i; // index in data...
int j; // index in line...
char temp[8];
char buffer[128];
char *ascii;
memset(buffer, 0, 128);
printf("---------> %s <--------- (%d bytes from %p)\n", caption, size, data);
// Printing the ruler...
printf(" +0 +4 +8 +c 0 4 8 c \n");
// Hex portion of the line is 8 (the padding) + 3 * 16 = 52 chars long
// We add another four bytes padding and place the ASCII version...
ascii = buffer + 58;
memset(buffer, ' ', 58 + 16);
buffer[58 + 16] = '\n';
buffer[58 + 17] = '\0';
buffer[0] = '+';
buffer[1] = '0';
buffer[2] = '0';
buffer[3] = '0';
buffer[4] = '0';
for (i = 0, j = 0; i < size; i++, j++)
{
if (j == 16)
{
printf("%s", buffer);
memset(buffer, ' ', 58 + 16);
sprintf(temp, "+%04x", i);
memcpy(buffer, temp, 5);
j = 0;
}
sprintf(temp, "%02x", 0xff & data[i]);
memcpy(buffer + 8 + (j * 3), temp, 2);
if ((data[i] > 31) && (data[i] < 127))
ascii[j] = data[i];
else
ascii[j] = '.';
}
if (j != 0)
printf("%s", buffer);
}
And the Python version. Python version is a bit smarter – it allows you to specify output stream.
def DumpBuffer(self, buf, length, caption="", dest=sys.stdout):
def GetPrintableChar(str):
if str.isalpha():
return str
else:
return '.'
dest.write('---------> %s <--------- (%d bytes)\n' % (caption, length))
dest.write(' +0 +4 +8 +c 0 4 8 c\n')
i = 0
while i < length:
if length - i > 16:
l = 16
else:
l = length - i
dest.write('+%04x ' % i)
s = ' '.join(["%02x" % ord(c) for c in buf[i:i + l]])
dest.write(s)
sp = 49 - len(s)
dest.write(' ' * sp)
s = ''.join(["%c" % GetPrintableChar(c) for c in buf[i:i + l]])
dest.write(s)
dest.write('\n')
i = i + 16

[…] you’ll be needing an hex dump function sooner or later. Alex, from Alex on Linux, has a great hex dump function for Python and […]