#include #include #include struct option longopts[] = { { "byte", 0, 0, 'b' }, { "short", 0, 0, 's' }, { "long", 0, 0, 'l' }, { "big_endian", 0, 0, 'E' }, { "little_endian", 0, 0, 'e' }, { "ascii", 0, 0, 'a' }, { "8bit", 0, 0, '8' }, { "width", 1 , 0, 'w' }, { "help", 0, 0, 'h' }, { 0, 0, 0, 0 } }; void usage(FILE *fp, char *name) { fprintf(fp, "Usage: %s [-bslEea8h] [-w] [FILE]\n", name); } void help(char *name) { usage(stdout, name); printf("\n\t-b --byte\t\t1 byte format\n"); printf("\t-s --short\t\t2 byte format\n"); printf("\t-l --long\t\t4 byte format\n"); printf("\t-E --big_endian\t\tbig endian format\n"); printf("\t-e --little_endian\tlittle endian format\n"); printf("\t-a --ascii\t\tinclude ascii column\n"); printf("\t-8 --8bit\t\tuse 8 bit characters in ascii column\n"); printf("\t-w --width=BYTES\toutput BYTES per output line\n"); printf("\t-h --help\t\tdisplay this help and exit\n"); } char opt_size = 1; char opt_endian = 0; char opt_ascii = 0; char opt_8bit = 0; int opt_width = 16; unsigned char *buffer; void dump_file(FILE *fp) { int i, j, k, count; for(count = 0; (k = fread(buffer, 1, opt_width, fp)); count += k) { for(i = k; i < opt_width; i++) buffer[i] = 0; printf("%08X: ", count); for(i = 0; i < k; i += opt_size) { putchar(' '); for(j = 1; j <= opt_size; j++) { printf("%02X", buffer[i + (opt_endian ? j - 1: opt_size - j)]); } } if(opt_ascii) { for(; i < opt_width; i += opt_size) fputs(" "+(8-(opt_size+opt_size)), stdout); printf(" \""); for(i = 0; i < opt_width; i++) { j = buffer[i]; putchar((j >= 32 && j < 127) || (opt_8bit && j >= 160) ? j : '.'); } putchar('"'); } putchar('\n'); } } int main(int argc, char **argv) { FILE *fp; int c; while((c = getopt_long(argc, argv, "bslEea8w:h", longopts, 0)) != -1) { switch(c) { case 'b': opt_size = 1; break; case 's': opt_size = 2; break; case 'l': opt_size = 4; break; case 'a': opt_ascii = 1; break; case 'E': opt_endian = 1; break; case 'e': opt_endian = 0; break; case '8': opt_8bit = 1; break; case 'h': help(argv[0]); return 0; case 'w': if((opt_width = atoi(optarg))) break; default: usage(stderr, argv[0]); return 1; } } if(opt_width % opt_size) { fprintf(stderr, "%s: width must be a multiple of the output size\n", argv[0]); return 1; } if(!(buffer = malloc(opt_width))) { perror(argv[0]); return 1; } if(optind < argc) { do { if(!(fp = fopen(argv[optind], "r"))) { perror(argv[optind]); return 1; } dump_file(fp); fclose(fp); } while(++optind < argc); } else { dump_file(stdin); } return 0; }