天天好心情:-)

<<<<<每天进步一点点<<<<<

老谢
老谢的公告
好咖啡要和朋友一起品尝
月 [下月] [上月]
最近评论
ss:谢了,拿过去试试看了。
czdvcc:wow power leveling
shajunjin:谢谢,非常感谢
好:很好很好,对我帮助挺大,谢谢
adm_qxx:我觉的一个人,如果能多一点体谅别人就很不错了。
文章分类
收藏
相册
瞬间成为永恒
常用链接
C++ Home
Cplusplus
Linux Source
Linux 内核分析
中国IT考试论坛
周伟明
天极网
希赛网
海天一色
编程中国
编程未眠夜
编程爱好者
编程论坛
网易学院
友情 Blog
.NET天空
一叶轻舟
偶要雷锋电子书下载
阿高的Blog
知识收藏
HTML学习
Justing的专栏
存档
订阅我的博客
XML聚合  FeedSky

原创 数据的十六进制显示收藏

新一篇: 串行通信基础 | 旧一篇: 求两个集合的差集

怎样在屏幕上以十六进制样式显示内存中的一段数据。

下面分以下几步来介绍:

1、字节转换成十六进制字符

2、数据块转换成十六进制字符串

3、将十六进制字符串格式化输出

4、将前面三步综合,将一段数据以十六进制显示。

 

 

1、字节转换成十六进制字符

定义十六进制字符的常量字符串,然后用字节的高四位和低四位分别作下标来直接访问常量表即得到十六进制的字符。(该功能用C语言库中的 ltoa 函数能很方便的实现)

void dtoh(UINT8 * hex,UINT8 n)

{

    static const UINT8 HEX[] = "0123456789ABCDEF";

 

    hex[0] = HEX[n / 16];

    hex[1] = HEX[n % 16];

}

2、数据块转换成十六进制字符串

将一块数据转化成16进制,存放到out 所指的缓冲区,len为要转换的字节个数

void dump_block(char * in,char * out,int len)

{

    int cur;

    for (cur = 0; cur < len; cur++)

    {

        dtoh(out + 2 * cur,in[cur]);

    }

}

3、将十六进制字符串格式化输出

本函数关键是用好printf的格式化输出功能。

printf("%08xh:",row_cnt++); 中的"%08x",表示输出十六进制整数,宽度为8个字符,左填充0

printf("0x%-3.2s",in + size * cur);中 "%-3.2s"表示输出字符串,宽度为3,精度为2(精度表示最多输出两个字符,多的舍去)左对齐,右填充空格。

 

该函数每次显示size个字符,共显示 len次,字符串起始地址 in

void hex_disp(char * in,int len,int size)

{

    int cur = 0;

    int row_cnt = 0;

   

    printf("%08dh:",row_cnt++);

    do {

        printf("0x%-3.2s",in + size * cur);

        cur++;

 

        if (cur % 8 == 0)

        {

            printf("\n%08dh:",row_cnt++);

        }      

    } while(cur < len);

}

 

显示效果如下:

4、将前面三步综合,将一段数据以十六进制显示。

下面的函数将对指定地址和长度的数据段以十六进制显示其内容。

void dump (char * in,int len)

{

    unsigned char * out = (unsigned char *)malloc(len * 2 + 1);

    dump_block(in,out,len);

    hex_disp(out,len,2);

    free(out);

}

 

5、改进

以上介绍的对数据以十六进制方式显示的方法,对数据较少的情况不错,但如果数据很大,就有问题了。上面的方法中转换时总是申请足够的缓冲区空间,而其实这是不必要的。将数据改变形式输出与数据的前后完全没有关系,因此可以边转换边输出。这样就避免因缓冲区申请过大带来的问题了。

发表于 @ 2007年06月01日 18:08:00|评论(loading...)|编辑

新一篇: 串行通信基础 | 旧一篇: 求两个集合的差集

评论:没有评论。

发表评论  


登录
Csdn Blog version 3.1a
Copyright © 老谢