url解码

#include <sys/time.h>
#include <vector>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>

char fromHex(char x){
	return (isdigit(x)) ? (x - '0') : (isupper(x) ? (x - 'A' + 10) : (x - 'a' + 10));
}

int url_decode(const char *src, char *buf, int buf_len){

	char ch, n1, n2;
	int  s, d;

	if(!src || !buf || buf_len <= 0){
		return -1;
	}

	for (s = 0, d = 0; (ch = src[s++]) != '\0' && d < buf_len;)
	{
		switch(ch){
		case '%':
			if((n1 = src[s++]) == '\0' || (n2 = src[s++]) == '\0'){
				/* wrong url */
				buf[d] = '\0';
				return -1;
			}
			else{
				buf[d++] = (fromHex(n1) << 4) | (fromHex(n2));
			}
		break;

		case '+':
			buf[d++] = ' ';
		break;

		default:
			buf[d++] = ch;
		break;
		}
	}

	if(ch == '\0'){
		if(d < buf_len){
			buf[d] = '\0';
			return 0;
		}
		else{
			/* overflow */
			buf[d-1] = '\0';
			return -1;
		}
	}
	else{
		/* buffer not enough */
		buf[d-1] = '\0';
		return -1;
	}
}

int main()
{
	char src[200];
	char dst[200];
	
	memset(src, 0, sizeof(src));
	memset(dst, 0, sizeof(dst));
	
	snprintf(src, sizeof(src), "%s", "%E5%BC%A0%E5%A5%95%E7%8E%B2");
	url_decode(src, dst, sizeof(dst));
	printf("src=%s\n", src);
	printf("dst=%s\n", dst);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_19385739/article/details/83012735