aaaaaa123456789 icon

Hexadecimal dumping library

aaaaaa123456789 | PRO | 08/24/14 02:01:11 AM UTC | 0 ⭐ | 608 👁️ | Never ⏰ | []
C |

2.43 KB

|

None

|

0 👍

/

0 👎

#include <stdio.h>
#include <string.h>
 
static void hexdump_small_dump(FILE *, void *, unsigned, unsigned);
 
void hex_dump (FILE * stream, void * data, unsigned length, unsigned initial_offset, int show_header) {
  if (!(stream && data && length)) return;
  if (show_header) fprintf(stream,
    "          00 01 02 03  04 05 06 07 - 08 09 0A 0B  0C 0D 0E 0F  0123456789ABCDEF\n"
    "--------- -- -- -- --  -- -- -- --   -- -- -- --  -- -- -- --  ----------------\n");
  if ((length + (initial_offset % 16)) <= 16) {
    hexdump_small_dump(stream, data, length, initial_offset);
    return;
  }
  unsigned char * dp = data;
  if (initial_offset % 16) {
    unsigned char initseg = 16 - (initial_offset % 16);
    hexdump_small_dump(stream, data, initseg, initial_offset);
    dp += initseg;
    initial_offset += initseg;
    length -= initseg;
  }
  char line[82];
  char buf[10];
  unsigned char pos;
  while (length >= 16) {
    strcpy(line,
      /* 0    5   10   15   20   25   30   35   40   45   50   55   60   65   70   75   80 */
        "********: ?? ?? ?? ??  ?? ?? ?? ?? - ?? ?? ?? ??  ?? ?? ?? ??  ................\n");
    sprintf(buf, "%08X", initial_offset);
    memcpy(line, buf, 8);
    for (pos = 0; pos < 16; pos ++) {
      sprintf(buf, "%02hhX", dp[pos]);
      memcpy(line + 10 + 3 * pos + (pos / 4) + (pos / 8), buf, 2);
      if ((dp[pos] >= 32) && (dp[pos] <= 126)) line[63 + pos] = dp[pos];
    }
    fprintf(stream, "%s", line);
    dp += 16;
    initial_offset += 16;
    length -= 16;
  }
  if (length) hexdump_small_dump(stream, dp, length, initial_offset);
}
 
static void hexdump_small_dump (FILE * stream, void * data, unsigned length, unsigned initial_offset) {
  char line[81];
  char buf[10];
  unsigned char start, pos, end;
  memset(line, ' ', 79);
  line[79] = '\n';
  line[80] = 0;
  line[8] = ':';
  start = initial_offset % 16;
  initial_offset &= ~15;
  end = start + length;
  sprintf(buf, "%08X", initial_offset);
  memcpy(line, buf, 8);
  if ((start < 8) && (end > 8)) line[35] = '-';
  for (pos = start; pos < end; pos ++) {
    sprintf(buf, "%02hhX", (pos - start)[(unsigned char *) data]);
    memcpy(line + 10 + 3 * pos + (pos / 4) + (pos / 8), buf, 2);
    line[63 + pos] = (((pos - start)[(unsigned char *) data] >= 32) && ((pos - start)[(unsigned char *) data] <= 126)) ?
                     (pos - start)[(unsigned char *) data] : '.';
  }
  fprintf(stream, "%s", line);
}

Comments