memdump函数实现
memdump函数实现
这个函数用于调试时dump一片内存区域的数据,可以dump出数据的内容以及可见字符,内容支持16进制,10进制,8进制,2进制显示,代码如下:
#include <stdio.h>
#include <ctype.h> //for isprint()
#define DUMP_CHAR(c) printf("%c", (c))
#define DUMP_HEX(c) printf("%02x ", (c))
#define DUMP_DEC(c) printf("%03d ", (c))
#define DUMP_OCT(c) printf("%04o ", (c))
#define DUMP_BIN(c) printf("%d%d%d%d%d%d%d%d ", ((c)&0x80)>>7, ((c)&0x40)>>6, ((c)&0x20)>>5, ((c)&0x10)>>4, ((c)&0x8)>>3, ((c)&0x4)>>2, ((c)&0x2)>>1, (c)&0x1)
// 按指定的格式dump一段内存
// addr、size 指定内存的起始地址和长度
// format指定输出格式,支持按16进制,8进制,10进制,2进制格式输出
// step指定每dump多少个字节后换行
void memdump(void* addr, int size, int format, int step)
{
int i, len;
int count = 0;
unsigned char *p = addr;
if(!p || size <= 0)
{
return;
}
while(count < size)
{
len = (size - count >= step ? step : size - count); // 判断剩余数据是否超出一行
printf("%p: ", p + count); //打印每行的起始地址
switch(format)
{
case 16: for(i = 0; i < len; ++i) DUMP_HEX(p[count + i]); break;
case 10: for(i = 0; i < len; ++i) DUMP_DEC(p[count + i]); break;
case 8: for(i = 0; i < len; ++i) DUMP_OCT(p[count + i]); break;
case 2: for(i = 0; i < len; ++i) DUMP_BIN(p[count + i]); break;
default: for(i = 0; i < len; ++i) DUMP_HEX(p[count + i]); break;
}
// 不足一行补齐空格
switch(format)
{
case 16: while(i++ < step) printf(" "); break;
case 10: while(i++ < step) printf(" "); break;
case 8: while(i++ < step) printf(" "); break;
case 2: while(i++ < step) printf(" "); break;
default: while(i++ < step)printf(" "); break;
}
// 输出内存的可见字符形式,如果是不可见字符,则以.代替
printf(" |");
for(i = 0; i < len; ++i)
{
isprint(p[count + i]) ? DUMP_CHAR(p[count + i]) : printf(".");
}
while(i++ < step)
{
printf(" ");
}
printf("|\n");
count += len;
}
printf("[END]\n");
}
int main(int argc, char *argv[])
{
char p[77];
memdump(p, sizeof(p), 16, 32);
memdump(p, sizeof(p), 10, 16);
memdump(p, sizeof(p), 8, 10);
memdump(p, sizeof(p), 2, 8);
return 0;
}
效果如下:


浙公网安备 33010602011771号