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)("|
");
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);即可。注意小心长度不要越界。

结果示例:

原文地址:https://www.cnblogs.com/fogcell/p/11427657.html