zoukankan      html  css  js  c++  java
  • 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);即可。注意小心长度不要越界。

    结果示例:

  • 相关阅读:
    远程、标签
    NUnit单元测试资料汇总
    jdk1.6下载页面
    javac: cannot execute binary file
    how to remove MouseListener / ActionListener on a JTextField
    Linux下chkconfig命令详解(转)
    如何让vnc控制由默认的twm界面改为gnome?(转)
    winzip15.0注冊码
    微服务的优缺点
    站点建设10个最好的响应的HTML5滑块插件
  • 原文地址:https://www.cnblogs.com/fogcell/p/11427657.html
Copyright © 2011-2022 走看看