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;
}
{
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;
}
“B1C8C8E7”经此函数转换后变成“比如”。
前者为后者的16进制的字符串表示。
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这个字符串数组中存储的是数而不是字符(虽然是以字符的形式存储)
不知道对否
学习ing
{
// 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 */