标签:hexdump diag 打印 ADDRWORD C语言 pf cyg CYG buf
好久没有更新博客了,今天更新下。
在开发调试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);即可。注意小心长度不要越界。
结果示例:
标签:hexdump,diag,打印,ADDRWORD,C语言,pf,cyg,CYG,buf 来源: https://www.cnblogs.com/fogcell/p/11427657.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。