好久没有更新博客了,今天更新下。
在开发调试debug中经常需要查看原始二进制信息,特别是当不能直接打印字符串时,查看原始二进制就特别有用了。以下的简单函数可以打印出像hexdump命令一样格式的信息。调试开发中特别方便和直观。源码来源于eCos。
1 typedef unsigned char cyg_uint8 ; 2 typedef unsigned int CYG_ADDRWORD; 3 typedef int __printf_fun(const char *fmt, ...); 4 void 5 diag_vdump_buf_with_offset(__printf_fun *pf, 6 cyg_uint8 *p, 7 CYG_ADDRWORD s, 8 cyg_uint8 *base) 9 { 10 int i, c; 11 if ((CYG_ADDRWORD)s > (CYG_ADDRWORD)p) { 12 s = (CYG_ADDRWORD)s - (CYG_ADDRWORD)p; 13 } 14 while ((int)s > 0) { 15 if (base) { 16 (*pf)("%08X: ", (CYG_ADDRWORD)p - (CYG_ADDRWORD)base); 17 } else { 18 (*pf)("%08X: ", p); 19 } 20 for (i = 0; i < 16; i++) { 21 if (i < (int)s) { 22 (*pf)("%02X ", p[i] & 0xFF); 23 } else { 24 (*pf)(" "); 25 } 26 if (i == 7) (*pf)(" "); 27 } 28 (*pf)(" |"); 29 for (i = 0; i < 16; i++) { 30 if (i < (int)s) { 31 c = p[i] & 0xFF; 32 if ((c < 0x20) || (c >= 0x7F)) c = '.'; 33 } else { 34 c = ' '; 35 } 36 (*pf)("%c", c); 37 } 38 (*pf)("| "); 39 s -= 16; 40 p += 16; 41 } 42 } 43 44 void 45 diag_dump_buf_with_offset(cyg_uint8 *p, 46 CYG_ADDRWORD s, 47 cyg_uint8 *base) 48 { 49 diag_vdump_buf_with_offset(printf, p, s, base); 50 } 51 52 void 53 diag_dump_buf(void *p, CYG_ADDRWORD s) 54 { 55 diag_dump_buf_with_offset((cyg_uint8 *)p, s, 0); 56 }
使用时直接调用:diag_dump_buf(buf,len);即可。注意小心长度不要越界。
结果示例: