Base64编解码

来源:互联网 发布:淘宝的超级店长在哪里 编辑:程序博客网 时间:2024/05/20 07:37


来源:Base64编解码


  由于实在不到原创地址,所以没法给出链接,但对原创表示感谢。 

       我测试了一下,发现下面程序的编解码器是正确的。 Base64编解码非常常见, 要大致弄清原理。 另外, 在编解码前, 最好判断一下,待定字符串是否已经是密文/明文的。 有方法哈!

       下面静静欣赏Base64编解码过程:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>    
  2. #include <malloc.h>    
  3. #include <string.h>    
  4.     
  5. char *base64_encode(const char *toBeEncoded);    
  6. char *base64_decode(const char *toBeDecoded);    
  7.     
  8. // 64 + 1, 最后的'='是填充符号  
  9. char table[] =    
  10. {    
  11. 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G',    
  12. 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N',    
  13. 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U',    
  14. 'V' , 'W' , 'X' , 'Y' , 'Z' , 'a' , 'b',    
  15. 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i',    
  16. 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p',    
  17. 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w',    
  18. 'x' , 'y' , 'z' , '0' , '1' , '2' , '3',    
  19. '4' , '5' , '6' , '7' , '8' , '9' , '+',    
  20. '/' , '='    
  21. };   
  22.   
  23.    
  24. char *base64_encode(const char *src)    
  25. {    
  26.     int count = 0;    
  27.     char *dst = NULL;    
  28.     int tmp = 0, buf = 0;    
  29.     char in[4] = {0};    
  30.     
  31.     int i = 0, j = 0;    
  32.     
  33.     count = strlen(src) / 3 + (strlen(src) % 3 ? 1 : 0);    
  34.     dst = (char *)malloc(count * 4 + 1);    
  35.     memset(dst, 0, count * 4 + 1);    
  36.         
  37.     
  38.     for(j = 0; j < count; j++)    
  39.     {    
  40.         memset(in, 0, sizeof(in));    
  41.         strncpy(in, src + j * 3, 3);    
  42.     
  43.         buf = 0;    
  44.         for(i = 0; i < strlen(in); i++)    
  45.         {    
  46.             tmp = (long)in[i];    
  47.             tmp <<= (16 - i * 8);    
  48.             buf |= tmp;    
  49.         }    
  50.     
  51.         for(i = 0; i < 4; i++)    
  52.         {    
  53.             if(strlen(in) + 1 > i)    
  54.             {    
  55.                 tmp = buf >> (18 - 6 * i);    
  56.                 tmp &= 0x3f;    
  57.                 dst[j * 4 + i] = table[tmp];    
  58.             }    
  59.             else    
  60.             {    
  61.                 dst[j * 4 + i] = '=';    
  62.             }    
  63.         }    
  64.     
  65.     }    
  66.     
  67.     return dst;    
  68. }    
  69.     
  70.     
  71. char *base64_decode(const char *src)    
  72. {    
  73.     int count = 0, len = 0;    
  74.     char *dst = NULL;    
  75.         
  76.     int tmp = 0, buf = 0;    
  77.     int i = 0, j = 0, k = 0;    
  78.     char in[5] = {0};    
  79.     len = strlen(src);    
  80.     count = len / 4;    
  81.         
  82.     dst = (char *)malloc(count * 3 + 1);    
  83.     memset(dst, 0, count * 3 + 1);    
  84.     
  85.     for(j = 0; j < count; j++)    
  86.     {    
  87.         memset(in, 0, sizeof(in));    
  88.         strncpy(in, src + j * 4, 4);    
  89.     
  90.         buf = 0;    
  91.         for(i = 0; i < 4; i++)    
  92.         {    
  93.             tmp = (long)in[i];    
  94.             if(tmp == '=')    
  95.             {    
  96.                 tmp = 0;    
  97.             }    
  98.             else    
  99.             {    
  100.                 for(k = 0; ; k++)    
  101.                 {    
  102.                     if(table[k] == tmp)    
  103.                         break;    
  104.                 }    
  105.                 tmp = k;    
  106.             }    
  107.             tmp <<= (18 - i * 6);    
  108.             buf |= tmp;    
  109.                 
  110.         }    
  111.     
  112.         for(i = 0; i < 3; i++)    
  113.         {    
  114.             tmp = buf >> (16 - i * 8);    
  115.             tmp &= 0xff;    
  116.             dst[j * 3 + i] = tmp;    
  117.         }    
  118.     }    
  119.     
  120.     return dst;     
  121. }    
  122.     
  123.     
  124. int main()    
  125. {    
  126.     char *src = NULL, *dst = NULL;    
  127.     src = "Microsoft & Apple!";   
  128.     printf("%d\n", strlen(src));  
  129.     
  130.     dst = base64_encode(src);    
  131.     printf("%s\n", dst);    
  132.     printf("%d\n", strlen(dst));  
  133.   
  134.     printf("%s\n", base64_decode(dst));    
  135.     return 0;    
  136. }   

       睡觉。
0 0