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;  }


原创粉丝点击