读书人

数据转换显示的有关问题

发布时间: 2013-04-26 16:27:53 作者: rapoo

数据转换显示的问题
本帖最后由 guoduhua 于 2013-04-25 16:29:54 编辑 一:我要做一个工作,把一个数组里保存的16进制数据,原封不动的变为字符,并显示出来,具体看如下的例子:
char Buf[100];
Buf[0] = 0xAB;
我要把0xAB直接变为字符“AB”,并显示出来
我尝试了两种方法:
1.
char data[1];
sprintf(data, "%X", Buf[0]);
2.
CString str = "";
str.Format("%X", Buf[0]);
但是,问题是,不论是第一种方法还是第二种方法,如果数据是数字,如:Buf[0] = 0x11;没问题,就能显示出来,但如果是字符,如:Buf[0] = 0xAB;则不论是char类型还是CString类型,得到的结果都是FFFFFFAB,为什么会这样,为什么前面会有6个F,即使我在"%X"里面加上数字来控制长度,也没有用,而且,每次显示出来的时候,还会显示“Run-Time Check Failure #2 - Stack around the variable 'data' was corrupted.”即:数组越界了。请问,我该怎么做才能真正显示我想要的数据呢?
二:我的这种方法,可能并不好,还有没有更好的办法,如果有更好的办法,只要能达到我最终的结果,欢迎提出来。 16进制字符显示
[解决办法]
sprintf(data, "%X", (unsigned char)Buf[0]);
[解决办法]

void HexDump(char *buf,int len) {
int i,j,k;
char binstr[80];

for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%04x -",i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}


printf("%s\n",binstr);
}
}

读书人网 >C++

热点推荐