C言語でバイナリダンプ

http://homepage1.nifty.com/~tetsu/ruby/cmd/hd.htmlを参考に、C言語でバイナリダンプする関数を書いてみました。
ファイル: hd.c

#include <stdio.h>
#include <ctype.h>

void
hd(const char *data, size_t len)
{
    char str[17];
    int r16, padlen;
    size_t i;

    for (i = 0, r16 = 0; i < len; i++, r16 = i % 16) {
	if (r16 == 0)
	    printf("%08x ", i);
	if (i % 4 == 0)
	    printf(" ");

	printf("%02x", data[i]);
	str[r16] = isprint(data[i]) ? data[i] : '.';
	    
	if (r16 == 15) {
	    str[16] = '\0';
	    printf("  %s\n", str);
	}
    }

    if (r16 != 0) {
	str[r16] = '\0';
	padlen = (16 - r16) * 2 + (16 - r16) / 4 + 1;
	printf("%*c %s\n", padlen, ' ', str);
    }
}

int
main(int argc, char *argv[])
{
    int i;

    for (i = 1; i < argc; i++) {
	hd(argv[i], strlen(argv[i]));
    }

    return 0;
}

ファイル: Makefile

PROG=hd
MAN=

.include <bsd.prog.mk>

実行例:

$ make
$ ./hd aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1234
00000000  61616161 61616161 61616161 61616161  aaaaaaaaaaaaaaaa
00000010  61616161 61616161 61616161 61613132  aaaaaaaaaaaaaa12
00000020  3334                                 34