jps@bsdpkh.UUCP (05/06/87)
Someone was asking for a quick and dirty hex dumper for PC's. This one works on UNIX, PC's, and just about anything else with a decent C compiler. I compiled it using Microsoft C with no changes. Have fun. Jim Silas ATT Altamonte Springs, Fl. --------------------------- Cut Here ------------------------------- /* Produce a hex dump of a file with ASCII on the side */ #include <stdio.h> main(argc, argv) int argc; char *argv[]; { int i; FILE *stream; if(argc == 1) dump(stdin); else { for(i = 1; i < argc; i++) { if(argc > 2) printf("\n>>>>>> %s:", argv[i]); if((stream = fopen(argv[i], "rb")) == NULL) { fprintf(stderr, "Can`t open %s\n", argv[i]); continue; } dump(stream); fclose(stream); } } } dump(stream) FILE *stream; { int i, n, size, endaddr; char *cp, *lp; char b[16]; /* input buffer */ char l[80]; /* line image buffer */ size = 0; while((n = fread(b, 1, 16, stream)) > 0) { endaddr = sprintf(l, " %8d %6x: ", size, size); cp = l + endaddr; for(i = 0, lp = b; i < 16; i++) { cp += sprintf(cp, "%02x", (0x0ff & *lp++)); if(i == 3 || i == 7 || i == 11) *cp++ = ' '; } *cp++ = ' '; *cp++ = ' '; *cp++ = ' '; if(n < 16) /* last line short? */ { /* Locate hex code for last character: */ lp = l + endaddr + 2*n + n/4; /* Blank out trailing hex codes: */ while(lp < l + 37 + endaddr) *lp++ = ' '; } lp = l + 37 + endaddr; *lp++ = '['; cp = b; for(i = 0; i < n; i++) { if((cp[i] > 0x1f) && (cp[i] < 0x7f)) *lp++ = cp[i]; else *lp++ = '.'; } *lp++ = ']'; *lp++ = '\0'; *lp++ = '\n'; fprintf(stdout,"\n%s", l); size += n; } fputc('\n', stdout); }