·您当前的位置:首页 > 技术教程 > JavaScript >

[js]一个代码范例C++的Base64加密解密算法源代码范例

时间:2017-04-23 20:13酷播
[js]一个代码范例C++的Base64加密解密算法源代码范例

[js]一个代码范例C++的Base64加密解密算法源代码范例

  1. // 头文件 base64.h   
  2.    
  3. #ifndef BASE64_H   
  4. #define BASE64_H   
  5.    
  6. const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";    
  7.    
  8. /* Base64 编码 */    
  9. char* base64_encode(const char* data, int data_len);    
  10.    
  11. /* Base64 解码 */    
  12. char *base64_decode(const char* data, int data_len);    
  13.    
  14. #endif   

源代码范例:

  1. // base64.cpp   
  2.    
  3. #include "stdafx.h"   
  4. #include "Base64.h"   
  5. #include <stdio.h>   
  6.    
  7. int main(int argc, char* argv[])    
  8. {    
  9.     char *t = "那个abcd你好吗,哈哈,ANMOL";    
  10.     int i = 0;    
  11.     int j = strlen(t);    
  12.     char *enc = base64_encode(t, j);    
  13.     int len = strlen(enc);    
  14.     char *dec = base64_decode(enc, len);    
  15.     printf("\noriginal: %s\n", t);    
  16.     printf("\nencoded : %s\n", enc);    
  17.     printf("\ndecoded : %s\n", dec);    
  18.     free(enc);    
  19.     free(dec);    
  20.     return 0;    
  21. }   
  22.    
  23.    
  24. /* Base64 编码 */    
  25. char *base64_encode(const char* data, int data_len)    
  26. {    
  27.     //int data_len = strlen(data);    
  28.     int prepare = 0;    
  29.     int ret_len;    
  30.     int temp = 0;    
  31.     char *ret = NULL;    
  32.     char *f = NULL;    
  33.     int tmp = 0;    
  34.     char changed[4];    
  35.     int i = 0;    
  36.     ret_len = data_len / 3;    
  37.     temp = data_len % 3;    
  38.     if (temp > 0)    
  39.     {    
  40.         ret_len += 1;    
  41.     }    
  42.     ret_lenret_len = ret_len*4 + 1;    
  43.     ret = (char *)malloc(ret_len);    
  44.          
  45.     if ( ret == NULL)    
  46.     {    
  47.         printf("No enough memory.\n");    
  48.         exit(0);    
  49.     }    
  50.     memset(ret, 0, ret_len);    
  51.     f = ret;    
  52.     while (tmp < data_len)    
  53.     {    
  54.         temp = 0;    
  55.         prepare = 0;    
  56.         memset(changed, '\0', 4);    
  57.         while (temp < 3)    
  58.         {    
  59.             //printf("tmp = %d\n", tmp);    
  60.             if (tmp >= data_len)    
  61.             {    
  62.                 break;    
  63.             }    
  64.             prepare = ((prepare << 8) | (data[tmp] & 0xFF));    
  65.             tmp++;    
  66.             temp++;    
  67.         }    
  68.         prepare = (prepare<<((3-temp)*8));    
  69.         //printf("before for : temp = %d, prepare = %d\n", temp, prepare);    
  70.         for (i = 0; i < 4 ;i++ )    
  71.         {    
  72.             if (temp < i)    
  73.             {    
  74.                 changed[i] = 0x40;    
  75.             }    
  76.             else    
  77.             {    
  78.                 changed[i] = (prepare>>((3-i)*6)) & 0x3F;    
  79.             }    
  80.             *f = base[changed[i]];    
  81.             //printf("%.2X", changed[i]);    
  82.             f++;    
  83.         }    
  84.     }    
  85.     *f = '\0';    
  86.          
  87.     return ret;    
  88.          
  89. }    
  90.    
  91. /* 转换算子 */    
  92. static char find_pos(char ch)      
  93. {    
  94.     char *ptr = (char*)strrchr(base, ch);//the last position (the only) in base[]    
  95.     return (ptr - base);    
  96. }    
  97.    
  98. /* Base64 解码 */    
  99. char *base64_decode(const char *data, int data_len)    
  100. {    
  101.     int ret_len = (data_len / 4) * 3;    
  102.     int equal_count = 0;    
  103.     char *ret = NULL;    
  104.     char *f = NULL;    
  105.     int tmp = 0;    
  106.     int temp = 0;   
  107.     int prepare = 0;    
  108.     int i = 0;    
  109.     if (*(data + data_len - 1) == '=')    
  110.     {    
  111.         equal_count += 1;    
  112.     }    
  113.     if (*(data + data_len - 2) == '=')    
  114.     {    
  115.         equal_count += 1;    
  116.     }    
  117.     if (*(data + data_len - 3) == '=')    
  118.     {//seems impossible    
  119.         equal_count += 1;    
  120.     }    
  121.     switch (equal_count)    
  122.     {    
  123.     case 0:    
  124.         ret_len += 4;//3 + 1 [1 for NULL]    
  125.         break;    
  126.     case 1:    
  127.         ret_len += 4;//Ceil((6*3)/8)+1    
  128.         break;    
  129.     case 2:    
  130.         ret_len += 3;//Ceil((6*2)/8)+1    
  131.         break;    
  132.     case 3:    
  133.         ret_len += 2;//Ceil((6*1)/8)+1    
  134.         break;    
  135.     }    
  136.     ret = (char *)malloc(ret_len);    
  137.     if (ret == NULL)    
  138.     {    
  139.         printf("No enough memory.\n");    
  140.         exit(0);    
  141.     }    
  142.     memset(ret, 0, ret_len);    
  143.     f = ret;    
  144.     while (tmp < (data_len - equal_count))    
  145.     {    
  146.         temp = 0;    
  147.         prepare = 0;    
  148.         while (temp < 4)    
  149.         {    
  150.             if (tmp >= (data_len - equal_count))    
  151.             {    
  152.                 break;    
  153.             }    
  154.             prepare = (prepare << 6) | (find_pos(data[tmp]));    
  155.             temp++;    
  156.             tmp++;    
  157.         }    
  158.         prepareprepare = prepare << ((4-temp) * 6);    
  159.         for (i=0; i<3 ;i++ )    
  160.         {    
  161.             if (i == temp)    
  162.             {    
  163.                 break;    
  164.             }    
  165.             *f = (char)((prepare>>((2-i)*8)) & 0xFF);    
  166.             f++;    
  167.         }    
  168.     }    
  169.     *f = '\0';    
  170.     return ret;    
  171. }   

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器