1. 程式人生 > >c++ 實現url的轉碼與解碼 urlencode urldecode

c++ 實現url的轉碼與解碼 urlencode urldecode



在網上找的程式碼各種問題,最終根據網上的版本修改實現了自己的一個版本,其中= 不做處理,- _都進行了轉碼

[cpp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include<iostream>
  2. #include<stdio.h> 
  3. usingnamespace std;  
  4. static unsigned char char_to_hex( unsigned char x )   
  5. {   
  6. return (unsigned char)(x > 9 ? x + 55: x + 48);   
  7. }   
  8. staticint is_alpha_number_char( unsigned 
    char c )   
  9. {   
  10. if ( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') )   
  11.   return 1;   
  12. return 0;   
  13. }   
  14. //url編碼實現 
  15. void urlencode( unsigned char * src, int  src_len, unsigned char * dest, int  dest_len )   
  16. {   
  17. unsigned char ch;   
  18. int  len = 0;   
  19. while (len < (dest_len - 4) && *src)   
  20. {   
  21.   ch = (unsigned char)*src;   
  22.   if (*src == ' ')   
  23.   {   
  24.    *dest++ = '+';   
  25.   }   
  26.   elseif (is_alpha_number_char(ch) || strchr("=!~*'()", ch))   
  27.   {   
  28.    *dest++ = *src;   
  29.   }   
  30.   else
  31.   {   
  32.    *dest++ = '%';   
  33.    *dest++ = char_to_hex( (unsigned char
    )(ch >> 4) );   
  34.    *dest++ = char_to_hex( (unsigned char)(ch % 16) );   
  35.   }    
  36.   ++src;   
  37.   ++len;   
  38. }   
  39. *dest = 0;   
  40. return ;   
  41. }   
  42. //解url編碼實現 
  43. unsigned char* urldecode(unsigned char* encd,unsigned char* decd)   
  44. {   
  45.     int j,i;   
  46.     char *cd =(char*) encd;   
  47.     char p[2];   
  48.     unsigned int num;   
  49.     j=0;   
  50.     for( i = 0; i < strlen(cd); i++ )   
  51.     {   
  52.         memset( p, '/0', 2 );   
  53.         if( cd[i] != '%' )   
  54.         {   
  55.             decd[j++] = cd[i];   
  56.             continue;   
  57.         }   
  58.   p[0] = cd[++i];   
  59.         p[1] = cd[++i];   
  60.         p[0] = p[0] - 48 - ((p[0] >= 'A') ? 7 : 0) - ((p[0] >= 'a') ? 32 : 0);   
  61.         p[1] = p[1] - 48 - ((p[1] >= 'A') ? 7 : 0) - ((p[1] >= 'a') ? 32 : 0);   
  62.         decd[j++] = (unsigned char)(p[0] * 16 + p[1]);   
  63.     }   
  64.     decd[j] = '/0';   
  65.     return decd;   
  66. }