1. 程式人生 > 其它 >re | C語言url編碼解碼

re | C語言url編碼解碼

C語言url編碼解碼

參考了網上一段程式碼改的,,,忘了記錄來源了。。。
主要要用到的功能是解碼部分。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int hex2dec(char c)
{
    if ('0' <= c && c <= '9') 
    {
        return c - '0';
    } 
    else if ('a' <= c && c <= 'f')
    {
        return c - 'a' + 10;
    } 
    else if ('A' <= c && c <= 'F')
    {
        return c - 'A' + 10;
    } 
    else 
    {
    	printf("> urldecode err\n");
        return -1;
    }
}

char dec2hex(short int c)
{
    if (0 <= c && c <= 9) 
    {
        return c + '0';
    } 
    else if (10 <= c && c <= 15) 
    {
        return c + 'A' - 10;
    } 
    else 
    {
    	printf("> urldecode err\n");
        return -1;
    }
}


//編碼一個url
void urlencode(char* url)
{
    int i = 0;
    int len = strlen(url);
    int res_len = 0;
    unsigned char* res = (unsigned char*)malloc(3*len+1);        // 動態分配3倍的長度 
    for (i = 0; i < len; ++i) 
    {
        char c = url[i];
        if (    ('0' <= c && c <= '9') ||
                ('a' <= c && c <= 'z') ||
                ('A' <= c && c <= 'Z') || 
                c == '/' || c == '.') 
        {
            res[res_len++] = c;
        } 
        else 
        {
            int j = (short int)c;
            if (j < 0)
                j += 256;
            int i1, i0;
            i1 = j / 16;
            i0 = j - i1 * 16;
            res[res_len++] = '%';
            res[res_len++] = dec2hex(i1);
            res[res_len++] = dec2hex(i0);
        }
    }
    res[res_len] = '\0';
    strcpy(url, (const char*)res);
    free(res);
}

// 解碼url 
void urldecode(char* url)
{
    int i = 0;
    unsigned int len = strlen(url);       // 長度 
    int res_len = 0;
    unsigned char* res = (unsigned char*)malloc(len+1);        // 動態分配同樣的長度 
    for (i = 0; i < len; ++i) 
    {
        char c = url[i];
        if (c != '%') 
        {
            res[res_len++] = c;
        }
        else 
        {
            char c1 = url[++i];
            char c0 = url[++i];
            int num = 0;
            num = hex2dec(c1) * 16 + hex2dec(c0);
            res[res_len++] = num;
        }
    }
    res[res_len] = '\0';
    strcpy(url, (const char*)res);
    free(res);
}

int main(int argc, char *argv[])
{
    char url[100] = "http://'測試/@mike./,././[;]";
    printf("原文:%s \n", url);
    
    urlencode(url); //編碼後
    printf("編碼: %s\n", url);

    urldecode(url); //解碼後
    printf("解碼: %s\n", url);

    return 0;
}