Base64Helper.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:4k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////////
  2. // General utilities : Base64 encode/decode helper class
  3. //
  4. // Copyright (c) 2003 by Morning
  5. // http://morningspace.51.net
  6. // mailto:moyingzz@etang.com
  7. //
  8. // Permission to use, copy, modify, distribute and sell this program for any 
  9. // purpose is hereby granted without fee, provided that the above copyright 
  10. // notice appear in all copies and that both that copyright notice and this 
  11. // permission notice appear in supporting documentation.
  12. //
  13. // It is provided "as is" without express or implied warranty.
  14. ////////////////////////////////////////////////////////////////////////////////
  15. #include "StdAfx.h"
  16. #include "Base64Helper.h"
  17. //
  18. namespace MUtils {
  19. const std::string Base64Helper::_base64_encode_chars = 
  20.     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  21. const char Base64Helper::_base64_decode_chars[] = 
  22. {
  23.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  24.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  25.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
  26.     52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
  27.     -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
  28.     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
  29.     -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
  30.     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
  31. };
  32. std::string Base64Helper::encode(const std::string in_str)
  33. {
  34.     std::string out_str;
  35.     unsigned char c1, c2, c3;
  36.     int i = 0;
  37.     int len = in_str.length();
  38.     while ( i<len )
  39.     {
  40.         // read the first byte
  41.         c1 = in_str[i++];
  42.         if ( i==len )       // pad with "="
  43.         {
  44.             out_str += _base64_encode_chars[ c1>>2 ];
  45.             out_str += _base64_encode_chars[ (c1&0x3)<<4 ];
  46.             out_str += "==";
  47.             break;
  48.         }
  49.         // read the second byte
  50.         c2 = in_str[i++];
  51.         if ( i==len )       // pad with "="
  52.         {
  53.             out_str += _base64_encode_chars[ c1>>2 ];
  54.             out_str += _base64_encode_chars[ ((c1&0x3)<<4) | ((c2&0xF0)>>4) ];
  55.             out_str += _base64_encode_chars[ (c2&0xF)<<2 ];
  56.             out_str += "=";
  57.             break;
  58.         }
  59.         // read the third byte
  60.         c3 = in_str[i++];
  61.         // convert into four bytes string
  62.         out_str += _base64_encode_chars[ c1>>2 ];
  63.         out_str += _base64_encode_chars[ ((c1&0x3)<<4) | ((c2&0xF0)>>4) ];
  64.         out_str += _base64_encode_chars[ ((c2&0xF)<<2) | ((c3&0xC0)>>6) ];
  65.         out_str += _base64_encode_chars[ c3&0x3F ];
  66.     }
  67.     return out_str;
  68. }
  69. std::string Base64Helper::decode(const std::string in_str)
  70. {
  71.     std::string out_str;
  72.     char c1, c2, c3, c4;
  73.     int i = 0;
  74.     int len = in_str.length();
  75.     while ( i<len)
  76.     {
  77.         // read the first byte
  78.         do {
  79.             c1 = _base64_decode_chars[ in_str[i++] ];
  80.         } while ( i<len && c1==-1);
  81.         if ( c1==-1)
  82.             break;
  83.         // read the second byte
  84.         do {
  85.             c2 = _base64_decode_chars[ in_str[i++] ];
  86.         } while ( i<len && c2==-1);
  87.         if ( c2==-1 )
  88.             break;
  89.         // assamble the first byte
  90.         out_str += char( (c1<<2) | ((c2&0x30)>>4) );
  91.         // read the third byte
  92.         do {
  93.             c3 = in_str[i++];
  94.             if ( c3==61 )       // meet with "=", break
  95.                 return out_str;
  96.             c3 = _base64_decode_chars[ c3 ];
  97.         } while ( i<len && c3==-1);
  98.         if ( c3==-1 )
  99.             break;
  100.         // assamble the second byte
  101.         out_str += char( ((c2&0XF)<<4) | ((c3&0x3C)>>2) );
  102.         // read the fourth byte
  103.         do {
  104.             c4 = in_str[i++];
  105.             if ( c4==61 )       // meet with "=", break
  106.                 return out_str;
  107.             c4 = _base64_decode_chars[ c4 ];
  108.         } while ( i<len && c4==-1 );
  109.         if ( c4==-1 )
  110.             break;
  111.         // assamble the third byte
  112.         out_str += char( ((c3&0x03)<<6) | c4 );
  113.     }
  114.     return out_str;
  115. }
  116. } // namespace MUtils