首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

数据转换显示的有关问题

2013-04-26 
数据转换显示的问题本帖最后由 guoduhua 于 2013-04-25 16:29:54 编辑一:我要做一个工作,把一个数组里保存

数据转换显示的问题
本帖最后由 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);
    }
}

热点排行