C++实现urlencode/urldecode编码

#include<iostream>
#include<stdio.h>
#include<cstring>

using namespace std;

const char hexchars[] = "0123456789abcdef";
const char HEXCHARS[] = "0123456789ABCDEF";

int PHPhtoi(char *pszStr)
{
    int iValue;
    int iChar;
    iChar = ((unsigned char *)pszStr)[0];
    if (isupper(iChar))
        iChar = tolower(iChar);
    iValue = (iChar >= '0' && iChar <= '9' ? iChar - '0' : iChar - 'a' + 10) * 16;
    iChar = ((unsigned char *)pszStr)[1];
    if (isupper(iChar))
        iChar = tolower(iChar);
    iValue += iChar >= '0' && iChar <= '9' ? iChar - '0' : iChar - 'a' + 10;
    return (iValue);
}

char * PHPUrlEncode(const char *pszBuff , int iLen , int* piNewLength)
{
    register unsigned char uChar;
    unsigned char *pszTo, *pszStart;
    unsigned char const *pszFrom, *pszEnd;
    pszFrom = (unsigned char *)pszBuff;
    pszEnd = (unsigned char *)pszBuff + iLen;
    pszStart = pszTo = new unsigned char[3*iLen+1];
    while (pszFrom < pszEnd) {
        uChar = *pszFrom++;
        if (uChar == ' ') {
            *pszTo++ = '+';
        }
        else if ((uChar < '0' && uChar != '-' && uChar != '.') ||
                (uChar < 'A' && uChar > '9') ||
                (uChar > 'Z' && uChar < 'a' && uChar != '_') ||
                (uChar > 'z')) {
            pszTo[0] = '%';
            pszTo[1] = HEXCHARS[uChar >> 4];
            pszTo[2] = HEXCHARS[uChar & 15];
            pszTo += 3;
        }
        else {
            *pszTo++ = uChar;
        }
    }
    *pszTo = 0;
    if (piNewLength) {
        *piNewLength = pszTo - pszStart;
    }
    return (char *) pszStart;
}

int PHPUrlDecode(char *pszStr)
{
    int iLen;
    char *pszDest = pszStr;
    char *pszData = pszStr;
    iLen=strlen(pszStr);
    while (iLen--)
    {
        if (*pszData == '+')
        {
            *pszDest = ' ';
        }
        else if (*pszData == '%' && iLen >= 2
                && isxdigit((int) *(pszData + 1))
                && isxdigit((int) *(pszData + 2)))
        {

            *pszDest = (char) PHPhtoi(pszData + 1);
            pszData += 2;
            iLen -= 2;
        }
		else
        {
            *pszDest = *pszData;
        }
        pszData++;
        pszDest++;
    }
    *pszDest = '\0';
    return pszDest - pszStr;
}

int main()
{
        char a[] = "wolike%1测试";
        PHPUrlDecode(a);
		
		int blen = 0;
		char *b = PHPUrlEncode(a, strlen(a), &blen);
		
        cout << b << " " << blen << endl;
}

猜你喜欢

转载自ciaos.iteye.com/blog/2250972