base64 encode 、uri_encode
来源:互联网 发布:明底线 知敬畏 懂感恩 编辑:程序博客网 时间:2024/05/16 07:25
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; }