编码过程中,有时候需要把一段缓冲区内容打印出来供调试参考。

由于缓冲区中可能含有'\0',而printf, fprintf等函数打印时遇到'\0'即止,所以打印结果很可能不完整。

于是就把很多年前写好的一个buff_dump函数翻了出来,贴个代码在此,方便用时来取。

#include <stdio.h>

#define  LOGPATH  "."
#define  LOGFILE  "buff_dump.log"

/***********************************************************
 *
 * 函数名 : buff_dump
 * 功  能 : 将缓冲区内容记录到日志文件
 * 参  数 : I  char *buf    缓冲区指针
 *          I  int   len    缓冲区长度
 * 返回值 : 无
 *
***********************************************************/
void buff_dump(char *buf, int len)
{
    int line = 0;
    int begin = 0;
    FILE *fp = NULL;
    register int i = 0;
    register int j = 0;
    unsigned char ch = 0;
    char *fopentype = "a+";

    char cmd[200];
    char filename[200];

    memset(cmd, 0x00, sizeof(cmd));
    memset(filename, 0x00, sizeof(filename));

    sprintf(filename, "%s/%s", LOGPATH, LOGFILE);
    fp = fopen(filename, fopentype);
    if ( NULL == fp )
    {
        memset(cmd, 0, sizeof(cmd));
        sprintf(cmd, "mkdir -p %s", LOGPATH);
        system(cmd);
        fp = fopen(filename, fopentype);
        if ( NULL == fp )
        {
            printf("打开日志文件[%s]错!\n", filename);
            return;
        }
    }

    fprintf(fp, "\n-----------------------Dump Begin ! Len = [%08d]--------------------------", len);
    fprintf(fp, "\nDisplacement 01-02-03-04-05-06- Hex Value -11-12-13-14-15-16  --ASCII Value--" );

    for ( line = 0; line*16 < len; line++ )
    {
        begin = line * 16;
        fprintf(fp, "\n%05d(%05x)", begin, begin);
        for ( i = 0; i < 16; i++ )
        {
            if ( begin+i < len )
            {
                fprintf(fp, " %02x", (unsigned char)(buf[begin+i]));
            }
            else
            {
                fprintf(fp, "   ");
            }
        }

        fprintf(fp, "  ");
        for ( j = 0; j<16 && begin+j<len; j++ )
        {
            ch = buf[begin+j];
            if ( !ch )
            {
                ch = '.';
            }
            else if ( !( isalnum(ch) || ispunct(ch) || (ch>0x80) ) )
            {
                ch = ' ';
            }
            fprintf(fp, "%c", ch);
        }
    }

    fprintf(fp, "\n-----------------------Dump  End  ! Len = [%08d]--------------------------\n\n", len);

    fflush(fp);
    fclose(fp);

    return;
}

调用实例:

int main(int argc, char *argv[])
{
    char *tmpstr = "1234567890abasdelkads随便啦DDLP*()$E__1";

    buff_dump(tmpstr, strlen(tmpstr));

    return 0;
}

运行结果:

-----------------------Dump Begin ! Len = [00000039]--------------------------
Displacement 01-02-03-04-05-06- Hex Value -11-12-13-14-15-16  --ASCII Value--
00000(00000) 31 32 33 34 35 36 37 38 39 30 61 62 61 73 64 65  1234567890abasde
00016(00010) 6c 6b 61 64 73 cb e6 b1 e3 c0 b2 44 44 4c 50 2a  lkads随便啦DDLP*
00032(00020) 28 29 24 45 5f 5f 31                             ()$E__1
-----------------------Dump  End  ! Len = [00000039]--------------------------

那些关于Unix/Linux的冷知识(一)

2013-06-18 (周二) by Weaver

那些关于Unix/Linux的冷知识之cp命令。

read more

使用 iconv 转换字符集

2013-06-17 (周一) by Weaver

使用 iconv 转换字符集

read more

端午节

2013-06-12 (周三) by Weaver

今天是农历五月初五,中国传统的节日——端午节。

read more

用 Pelican 和 GitHub Pages 搭建免费的个人博客

2013-06-06 (周四) by Weaver

用 Pelican 和 GitHub Pages 搭建免费的个人博客

read more

Python内置函数实现进制转换

2013-06-05 (周三) by Weaver

使用Python内置函数:bin()、oct()、int()、hex()可实现进制转换。

read more

GitHub Pages 开张大吉

2013-06-04 (周二) by Weaver

GitHub Pages 开张大吉

read more