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;
}

效果如下:

posted @ 2020-08-15 13:47  MidLaneTop  阅读(920)  评论(0)    收藏  举报