base64 encode 、uri_encode

static const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";  

static char *base64_encode(char* data, int data_len)  
{  
    int prepare;  
    int ret_len;  
    int temp = 0;  
    char *ret = NULL;  
    char *f = NULL;  
    int tmp = 0;  
    char changed[4];  
    int i = 0;  
	int num=0;
    ret_len = data_len / 3;  
    temp = data_len % 3;  
    if (temp > 0)  {  
        ret_len += 1;  
    }  
    ret = (char *)malloc(ret_len*4 + 1);  
    if ( ret == NULL)  {  
        perror("No enough memory./n");  
        exit(0);  
    }  
    f = ret;  
    while (tmp < data_len)  {  
        temp = 0;  
        prepare = 0;  
        memset(changed, 0, 4);  
        while (temp < 3)  {  
            if (tmp >= data_len) {  
                break;  
            }  
            prepare = ((prepare << 8) | (data[tmp] & 0xFF));  
            tmp++;  
            temp++;  
        }  
        prepare = (prepare<<((3-temp)*8));  
        for (i = 0; i < 4 ;i++ )  {  
            if (temp < i)   {  
                changed[i] = 0x40;  
            }  
            else  {  
                changed[i] = (prepare>>((3-i)*6)) & 0x3F;  
            }  
			num=changed[i];
            *f = base[num];  
            f++;  
        }  
    }  
    *f = 0;  
    return ret;  
      
}  



static unsigned char hexchars[] = "0123456789ABCDEF";  

char * urlencode(char const *s, int len, int *new_length)
{
    register unsigned char c;      
	unsigned char *to, *start;  
	unsigned char const *from, *end;
	from = (unsigned char *)s;   
	end  = (unsigned char *)s + len;    
	start = to = (unsigned char *) calloc(1, 3*len+1);   
	while (from < end)       {  
		c = *from++;       
		if (c == ' ')    {       
			*to++ = '+';       
		} else if ((c < '0' && c != '-' && c != '.') ||(c < 'A' && c > '9') || (c > 'Z' && c < 'a' && c != '_') || \
		(c > 'z')) {       
			to[0] = '%';         
			to[1] = hexchars[c >> 4];          
			to[2] = hexchars[c & 15];           
			to += 3;         
		} else {     
			*to++ = c;        
		}      
	}      
	*to = 0;   
	if (new_length)   {      
		*new_length = to - start;   
	}     
	return (char *) start;  

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值