[原]VC++ URL编码的解码

来源:互联网 发布:交换机ge端口是什么 编辑:程序博客网 时间:2024/05/19 00:43
bool  DecodeUrl(char *Src, char  *url, int  MaxLen){    if(NULL == url || NULL == Src)    {        return false;    }    if(MaxLen == 0)    {        return false;    }    char  *p = Src;  // 用来循环    int    i = 0;    // i用来控制url数组    /* 临时保存url编码的数据       例如: %1A%2B%3C    */    char  t = '\0';    while(*p != '\0' && MaxLen--)    {        if(*p == 0x25) // 0x25 = '%'        {            /* 以下是十六进制数中常出现的大写字母,小写字母,数字的判断 */            if(p[1] >= 'A' && p[1] <= 'Z') // 大写字母            {                t = p[1] - 'A' + 10;  // A = 10,下同            }            else if(p[1] >= 'a' && p[1] <= 'z') // 小写字母            {                t = p[1] - 'a' + 10;            }            else if(p[1] >= '0' && p[1] <= '9') // 数字            {                t = p[1] - '0';            }            t *= 16;  // 将数放到十位上去            if(p[2] >= 'A' && p[2] <= 'Z') // 大写字母            {                t += p[2] - 'A' + 10;            }            else if(p[2] >= 'a' && p[2] <= 'z') // 小写字母            {                t += p[2] - 'a' + 10;            }            else if(p[2] >= '0' && p[2] <= '9') // 数字            {                t += p[2] - '0';            }            // 到此合成了一个十六进制数            url[i] = t;            p += 3, i++;        }        else        {            // 没有被url编码的数据            // '+'特殊处理.它相当于一个空格            if(*p != '+')            {                url[i] = *p;            }            else            {                url[i] = 0x20;            }            i++;            p++;        }    }    url[i] = '\0';  // 结束符    return true;}


0 0