// // Created by MightyPork on 2017/12/04. // #include "platform.h" #include "hexdump.h" void hexDump(const char *restrict desc, const void *restrict addr, uint32_t len) { uint32_t i; uint8_t buff[17]; uint8_t *pc = (unsigned char*)addr; // Output description if given. if (desc != NULL) PRINTF ("%s:\r\n", desc); if (len == 0) { PUTS(" ZERO LENGTH\r\n"); return; } // Process every byte in the data. for (i = 0; i < len; i++) { // Multiple of 16 means new line (with line offset). if ((i % 16) == 0) { // Just don't print ASCII for the zeroth line. if (i != 0) { PUTS(" "); PUTS((const char *) buff); PUTS("\r\n"); } // Output the offset. PRINTF (" %04"PRIx32" ", i); } // Now the hex code for the specific character. PRINTF (" %02x", pc[i]); // And store a printable ASCII character for later. if ((pc[i] < 0x20) || (pc[i] > 0x7e)) buff[i % 16] = (uint8_t) ((pc[i] == 0xA5) ? ' ' : '.'); // special treatment for 0xA5 which is used as a filler in stacks else buff[i % 16] = pc[i]; buff[(i % 16) + 1] = '\0'; } // Pad out last line if not exactly 16 characters. while ((i % 16) != 0) { PUTS(" "); i++; } // And print the final ASCII bit. PRINTF (" %s\r\n", buff); (void)buff; }