c语言解析url编码,url编码与解码(C语言)

#define _CRT_SECURE_NO_WARNINGS

#include

#include

#include

#include

typedef enum _BOOL_

{

FALSE = 0,

TRUE

} BOOL;

#ifdef GCC_GUN_C

#define HEX_TO_DEC(ch)

({

char ret = -1;

if (ch >= '0' && ch <= '9') ret = ch - '0';

else if (ch >= 'a' && ch <= 'z') ret = ch - 'a' + 10;

else if (ch >= 'A' && ch <= 'Z') ret = ch - 'A' + 10;

else ret = -1;

ret;

})

#else

int hex2dec(const char ch)

{

if (ch >= '0' && ch <= '9') return ch - '0';

if (ch >= 'a' && ch <= 'z') return ch - 'a' + 10;

if (ch >= 'A' && ch <= 'Z') return ch - 'A' + 10;

return -1;

}

#endif

BOOL urlencode(char* *lpszDest, const char* cszSrc, size_t nLen);

BOOL urldecode(char* *lpszDest, const char* pszUrl, size_t nLen);

int main()

{

char str[] = "http://www.baidu.com/s?ie=utf-8&f=8&tn=baidu&wd=临时邮箱";

char *pUrl = NULL;

char* pSrc = NULL;

printf("编码前:%s

", str);

urlencode(&pUrl, str, strlen(str)); // 编码

printf("编码后:%s

", pUrl);

urldecode(&pSrc, pUrl, strlen(pUrl)); // 解码

printf("解码后:%s

", pSrc);

if (pUrl)

free(pUrl); // 释放内存

if (pSrc)

free(pSrc); // 释放内存

_getch();

return 0;

}

// GB2312编码转url编码

BOOL urlencode(char* *lpszDest, const char* cszSrc, size_t nLen)

{

size_t i = 0, nIndex = 0;

size_t len = nLen;

char hex[] = "0123456789ABCDEF";

char ch;

char* pNew = NULL;

if (!cszSrc)

return FALSE;

*lpszDest = (char *)malloc(nLen * sizeof(char) + 1); // 增加一个长度存储' '

if (NULL == *lpszDest)

return FALSE;

for (i = 0; i < nLen; i++) {

ch = cszSrc[i];

if ((ch >= '0' && ch <= '9') ||

(ch >= 'a' && ch <= 'z') ||

(ch >= 'A' && ch <= 'Z') ||

ch == '-' || ch == '_' || ch == '.' || ch == '~') {

(*lpszDest)[nIndex++] = ch;

}

else if (ch == ' ') {

(*lpszDest)[nIndex++] = '+';

}

else {

int tmp = ch;

if (ch < 0)

tmp += 256;

(*lpszDest)[nIndex++] = '%';

(*lpszDest)[nIndex++] = hex[tmp / 16];

(*lpszDest)[nIndex++] = hex[tmp % 16];

}

if (nIndex >= len - 1) {

len *= 3;

pNew = malloc(sizeof(char) * len);

memset(pNew, ' ', sizeof(char) * len);

if (!pNew)

return FALSE;

memcpy(pNew, *lpszDest, nIndex);

free(*lpszDest);

*lpszDest = pNew;

}

}

*lpszDest = (char *)realloc(pNew, sizeof(char) * strlen(pNew) + 1); // 输出参数

if (!*lpszDest)

{

free(*lpszDest);

return FALSE;

}

return TRUE;

}

// url解码函数

BOOL urldecode(char* *lpszDest, const char* pszUrl, size_t nLen)

{

size_t i = 0, nIndex = 0;

char ch;

char* pNew = NULL;

*lpszDest = (char *)malloc(nLen * sizeof(char));

if (NULL == *lpszDest)

return FALSE;

memset(*lpszDest, ' ', nLen);

for (i = 0; i < nLen; ++i) {

ch = pszUrl[i];

if (ch != '%') {

(*lpszDest)[nIndex++] = ch;

}

else {

char h = pszUrl[++i];

char l = pszUrl[++i];

#ifdef GCC_GUN_C

int num = (HEX_TO_DEC(h) << 4) | HEX_TO_DEC(l);

#else

int num = (hex2dec(h) << 4) | hex2dec(l);

#endif

(*lpszDest)[nIndex++] = num;

}

}

pNew = (char*)malloc(sizeof(char) * strlen(*lpszDest) + 1);

if (!pNew)

return FALSE;

strncpy(pNew, *lpszDest, strlen(*lpszDest) + 1); // +1拷贝' '

free(*lpszDest);

*lpszDest = pNew;

return TRUE;

}

你可能感兴趣的:(c语言解析url编码)