C语言打印hexdump的最好实践
Posted fogcell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言打印hexdump的最好实践相关的知识,希望对你有一定的参考价值。
好久没有更新博客了,今天更新下。
在开发调试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)("|\\n"); 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);即可。注意小心长度不要越界。
结果示例:
以上是关于C语言打印hexdump的最好实践的主要内容,如果未能解决你的问题,请参考以下文章