int StrConv(char *str1, char *str2)
{
    int i,j,err,slen;
    char c1,c2;    slen=strlen(str1);
    err=0;
    i=0;j=0;
    while (i<slen) {
        if (str1[i]>='0' && str1[i]<='9')   
            c1=str[i]-'0';        //'0'到'9'
        else if (str1[i]>='A' && str1[i]<='F')   
            c1=str[i]-'A'+10;        //'A'到'F'
        else 
            {err=-1;break;}        //其它字符出错        i++;        if (str1[i]==0)             //长度不为2的倍数
            {err=-1;break;}
        if (str1[i+1]>='0' && str1[i]<='9') 
            c2=str[i]-'0';        //'0'到'9'
        else if (str1[i]>='A' && str1[i]<='F') 
            c2=str[i]-'A'+10;        //'A'到'F'
        else 
            {err=-1;break;}        //其它字符出错        str2[j]=c1*16+c2;        i++;j++;
    }
    str2[j]=0;
    return err;
}

解决方案 »

  1.   

    比如:
    “B1C8C8E7”经此函数转换后变成“比如”。
    前者为后者的16进制的字符串表示。
      

  2.   

    应该是将str1中的字符串没两个一组计算它对应的十六进制的值比如
    str1 = "123240"
    str2[0] = 1*16+2 -------->对应"12"的十六进制值
    str2[1] = 3*16+2 -------->对应"32"的十六进制值
    str2[2] = 4*16+0 -------->对应"40"的十六进制值
    在转换过程中加入了一些错误机制,比如str1[i]不在'0'-'9' 或者 'A'-'F'之间以及
       if (str1[i]==0)             //长度不为2的倍数要注意的是在str2这个字符串数组中存储的是数而不是字符(虽然是以字符的形式存储)
    不知道对否
      

  3.   

    o  理解错了~~~~
    学习ing
      

  4.   

    void CAboutDlg::OnBnClickedOk()
    {
    // TODO: 在此添加控件通知处理程序代码
    char buffer[] = {"%D5%C5%C8%FD is a boy"};
    int len = strlen(buffer);
    char *temp =new  char[len];
    int i = 0, j = 0;
    bool flag = false;   //标志,判断是否是%后边的第一或第二个字符
    memset(temp, 0, len);//把buffer所指内存区域的前count个字节设置成字符c。返回指向buffer的指针。 while (j < len)//循环每一个字符
    {
    if (buffer[j] != '%' && flag)  //如果字符不等于%而且标志符是TRUE
    {
    temp[i] = (buffer[j] - 'A') < 0?(buffer[j] - '0'):(buffer[j] -'A' + 10);   //D5  213   D:69 - A:65=4             //当前字符减去@:64 A:65 z:122 123:{
    j ++; //源下一字符
    temp[i] = temp[i] * 16 + ((buffer[j] - 'A') < 0?(buffer[j] - '0'):(buffer[j] -'A' + 10));
    i ++;
    j ++;
    flag = false;
    } else if (buffer[j] != '%' && !flag)   //如果字符不于%而且标志符为FALSE
    {
         temp[i ++] = buffer[j ++];
    }
    else if (buffer[j] == '%')  //字符等于% 跳过这一字符%不将其加入
    {
    j ++;
    flag = true;
    } }
    strcpy(buffer,temp); //CString str(temp);
    //AfxMessageBox(str); CString str(temp);
    AfxMessageBox(str); delete []temp; OnOK();
    }
    /*
    63 ?号处理 %3F
    64 @不处理
    65 A
    122 z
    123 {号处理 %7B
    根据CGB2312-80中的汉字、图形符号,根据其位置分为94个“区”,每个区包含94个汉字,每个汉字字符又称作“位”。其中“区”的序号,由01到94,“位”的序号,也是从01到94。若以横向表示“位”号,纵向表示“区”号,则“区”和“位”构成一个二维坐标。给定一个“区”值和“位”值就可以确定一个唯一的汉字或图形符号。所以4位数字就可以唯一确定一个汉字或符号,下面给出汉字的区内和内码对应关系表。区位码(10进制)内码(16进制) 
    区号   位号 高字节 低字节 
    1—9   1—94 A1—A9 A1—FE 
    10—12 1—94 AA—AC A1—FE 
    13—15 1—94 AD—AF A1—FE 
    16—87 1—94 B0—F7 A1—FE */