怎样在屏幕上以十六进制样式显示内存中的一段数据
2008-12-11 19:32
330 查看
怎样在屏幕上以十六进制样式显示内存中的一段数据。
下面分以下几步来介绍:
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、改进
以
上介绍的对数据以十六进制方式显示的方法,对数据较少的情况不错,但如果数据很大,就有问题了。上面的方法中转换时总是申请足够的缓冲区空间,而其实这是
不必要的。将数据改变形式输出与数据的前后完全没有关系,因此可以边转换边输出。这样就避免因缓冲区申请过大带来的问题了。
下面分以下几步来介绍:
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、改进
以
上介绍的对数据以十六进制方式显示的方法,对数据较少的情况不错,但如果数据很大,就有问题了。上面的方法中转换时总是申请足够的缓冲区空间,而其实这是
不必要的。将数据改变形式输出与数据的前后完全没有关系,因此可以边转换边输出。这样就避免因缓冲区申请过大带来的问题了。
相关文章推荐
- 怎样将一段内存中的HTML在CHtmlView中显示出来?
- 怎样使原先为"0""1"的数据转为"无""有"显示?
- 我的程序怎么在屏幕显示不了读入的数据?
- 触摸屏幕,滚动页面内容到底部,上拉刷新显示数据
- 编写一个void sort(int*x,int n)实现将x数组中的n个数据从大到小排序。n及数组元素在主函数中输入。将结果显示在屏幕上并输出到文件
- 将数据显示到屏幕上(用ListView)
- linux应用Xlib来显示内存图像数据到窗口的方式
- 怎样使层相对于屏幕居中显示
- Android GridView实现多种不同布局样式显示数据
- 抄360于Launcher浮动窗口的屏幕显示内存使用情况(改进版)
- JQuery Highcharts图表控件多样式显示多组数据
- 编写一个void sort(int*x,int n)实现将x数组中的n个数据从大到小排序。n及数组元素在主函数中输入。将结果显示在屏幕上并输出到文件
- 将<div><ul><li>中的数据设置为无编号,横向显示并且居中显示在下方的样式,以及在打开新的页面。
- 怎样让 表中的数据 <a href='aa'>Game</a> 原本的显示在网页中
- 根据数据显示行的样式
- 怎样将查询到的数据显示在DataGridView中
- 自定义AlertDialog样式,根据屏幕大小来显示
- 把从SQList查询的数据显示到屏幕上
- 内存数据的十六进制Print
- kendo ComboBox显示多列数据(自定义样式)