在调试代码的时候,经常需要dump一段内存,有时候不得不自己动手写一个函数。
现在先记录一个简单版本的内存打印函数。
const char* hexstr = "0123456789ABCDEF"; void dump(int level, const char* tag, const uint8_t* data, uint32_t length) { #define _CNT_PER_LINE (1 << 4) char buffer[_CNT_PER_LINE * 3 + 10 + 2]; int offset = 0; uint32_t addr; printf("[%s] dump %u byte(s):\n", tag, length); for (uint32_t i=0; i<length; ) { if (!(i & (_CNT_PER_LINE - 1))) { addr = (uint32_t)&data[i]; buffer[offset++] = hexstr[(addr >> 28) & 0x0F]; buffer[offset++] = hexstr[(addr >> 24) & 0x0F]; buffer[offset++] = hexstr[(addr >> 20) & 0x0F]; buffer[offset++] = hexstr[(addr >> 16) & 0x0F]; buffer[offset++] = hexstr[(addr >> 12) & 0x0F]; buffer[offset++] = hexstr[(addr >> 8) & 0x0F]; buffer[offset++] = hexstr[(addr >> 4) & 0x0F]; buffer[offset++] = hexstr[(addr >> 0) & 0x0F]; buffer[offset++] = ':'; buffer[offset++] = ' '; } buffer[offset++] = hexstr[(data[i] >> 4) & 0x0F]; buffer[offset++] = hexstr[data[i] & 0x0F]; i++; if (i & (_CNT_PER_LINE - 1)) { buffer[offset++] = ' '; } else { buffer[offset++] = '\n'; buffer[offset] = '\0'; printf("%s", buffer); offset = 0; } } if (offset) { buffer[offset++] = '\n'; buffer[offset] = '\0'; printf("%s", buffer); } }
可以改进的地方:
1、将buffer从外部传进来;
2、将print函数由形参传进来;
3、在每一行的后面打印内存对应的ASCII字符。
标签:addr,buffer,打印,++,内存,offset,日志,0x0F,hexstr From: https://www.cnblogs.com/ssdq/p/17538491.html