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

来源:互联网 发布:三国乱世吕布觉醒数据 编辑:程序博客网 时间:2024/05/24 22:42

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

下面分以下几步来介绍:

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、改进

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