头文件
#ifndef MY_LOG_H
#define MY_LOG_H
#include "stddef.h"
/**
* @brief 输出内存数据
* @param addr 内存起始地址
* @param len 数据长度
* @param note 备注信息
*/
void Log_Show_Memory(const void *addr, size_t len, const char *note);
#endif
.c文件
#include "my_log.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void Log_Show_Memory(const void *addr, size_t len, const char *note)
{
if (addr==NULL || len==0)
{
printf("invalid address or length!\n");
return;
}
printf("\n");
printf("================================Show Memory================================\n");
// 输出备注和起始地址,偏移地址
if(note != NULL) {
printf("note: %s\n", note);
}
printf("memaddr: %p~%p, %ld Byte\n", addr, addr+len, len);
printf("offaddr: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII\n");
printf("-------- ------------------------------------------------ ----------------\n");
const unsigned char *p = (const unsigned char *)addr;
size_t i, j;
for(i=0; i<len; i+=16)
{
// 输出偏移地址
printf("%08zX ", i);
// 输出十六进制数据
for(j=0; j<16; j++)
{
if (i+j < len)
{
printf("%02X ", p[i+j]);
}
else
{
printf(" "); // 填充空格
}
}
printf(" ");
// 输出可打印字符
for(j=0; j<16; j++)
{
if(i+j < len)
{
unsigned char c = p[i+j];
if(isprint(c))
{
printf("%c", c);
}
else
{
printf(".");
}
}
}
printf("\n");
}
printf("===========================================================================\n");
printf("\n");
}