Chinaunix首页 | 论坛 | 博客
  • 博客访问: 134705
  • 博文数量: 20
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 247
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-12 22:24
个人简介

学霸

文章分类

全部博文(20)

文章存档

2016年(1)

2015年(11)

2014年(8)

我的朋友

分类: C/C++

2015-05-13 10:30:12

c++ version

点击(此处)折叠或打开

  1. /* solution 1 */
  2. bool Base64Encode(const string& input, string& output) {
  3.     namespace bai = boost::archive::iterators;
  4.     const string base64_padding[] = {"", "==","="};

  5.     std::stringstream os;

  6.     typedef bai::base64_from_binary<bai::transform_width<const char *, 6, 8> > base64_enc;

  7.     std::copy(base64_enc(input.c_str()), base64_enc(input.c_str() + input.size()),std::ostream_iterator<char>(os));

  8.     os << base64_padding[input.size() % 3];

  9.     output = os.str();

  10.     return output.empty() == false;
  11. }


  12. bool Base64Decode(const string& input, string& output) {
  13.   namespace bai = boost::archive::iterators;

  14.   std::stringstream os;

  15.   typedef bai::transform_width<bai::binary_from_base64<const char *>, 8, 6> base64_dec;

  16.   unsigned int size = input.size();

  17.   if (size && input[size - 1] == '=') {
  18.     --size;
  19.     if (size && input[size - 1] == '=')
  20.         --size;
  21.   }
  22.   if (size == 0) return false;

  23.   std::copy(base64_dec(input.data()), base64_dec(input.data() + size),std::ostream_iterator<char>(os));

  24.   output = os.str();

  25.   return output.empty() == false;
  26. }


  27. /* solution 2 */
  28. bool Base64Encode(const string& input, string& output) {
  29.     namespace bai = boost::archive::iterators;

  30.     stringstream result;

  31.     typedef bai::base64_from_binary<bai::transform_width<string::const_iterator, 6, 8> > Base64EncodeIterator;
  32.   
  33.     copy(Base64EncodeIterator(input.begin()) , Base64EncodeIterator(input.end()), ostream_iterator<char>(result));

  34.     size_t equal_count = (3 - input.length() % 3) % 3;
  35.     for (size_t i = 0; i < equal_count; i++) {
  36.     result.put('=');
  37.     }
  38.     output = result.str();
  39.   return output.empty() == false;
  40. }

  41. bool Base64Decode(const string& input, string& output) {
  42.     namespace bai = boost::archive::iterators;
  43.     typedef bai::transform_width<bai::binary_from_base64<string::const_iterator>, 8, 6> Base64DecodeIterator;
  44.     stringstream result;
  45.     try {
  46.         copy(Base64DecodeIterator(input.begin()) , Base64DecodeIterator(input.end()), ostream_iterator<char>(result));
  47.     } catch(...) {
  48.         return false;
  49.     }
  50.     output = result.str();
  51. return output.empty() == false;
  52. }
here is a need to call the boost library

点击(此处)折叠或打开

  1. #include <boost/archive/iterators/base64_from_binary.hpp>
  2. #include <boost/archive/iterators/binary_from_base64.hpp>
  3. #include <boost/archive/iterators/transform_width.hpp>
  4. #include
  5. #include
  6. #include
  7. using namespace std;

c version
点击(此处)折叠或打开
  1. #define XYSSL_ERR_BASE64_BUFFER_TOO_SMALL -0x0010
  2. #define XYSSL_ERR_BASE64_INVALID_CHARACTER -0x0012

  3. static const unsigned char base64_enc_map[64] = {
  4.   'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
  5.   'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
  6.   'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
  7.   'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  8.   'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
  9.   'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
  10.   '8', '9', '+', '/'
  11. };

  12. static const unsigned char base64_dec_map[128] = {
  13.   127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
  14.   127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
  15.   127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
  16.   127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
  17.   127, 127, 127, 62, 127, 127, 127, 63, 52, 53,
  18.   54, 55, 56, 57, 58, 59, 60, 61, 127, 127,
  19.   127, 64, 127, 127, 127, 0, 1, 2, 3, 4,
  20.   5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
  21.   15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
  22.   25, 127, 127, 127, 127, 127, 127, 26, 27, 28,
  23.   29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
  24.   39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
  25.   49, 50, 51, 127, 127, 127, 127, 127
  26. };

  27. /*
  28. * Encode a buffer into base64 format
  29. */
  30. int
  31. base64_encode (const unsigned char *src, int slen, unsigned char *dst,
  32.      int *dlen)
  33. {
  34.   int i, n;
  35.   int C1, C2, C3;
  36.   unsigned char *p;

  37.   if (slen == 0)
  38.     return 0;

  39.   n = (slen << 3) / 6;

  40.   switch ((slen << 3) - (n * 6))
  41.     {
  42.     case 2:
  43.       n += 3;
  44.       break;
  45.     case 4:
  46.       n += 2;
  47.       break;
  48.     default:
  49.       break;
  50.     }

  51.   if (*dlen < n + 1)
  52.     {
  53.       *dlen = n + 1;
  54.       return (XYSSL_ERR_BASE64_BUFFER_TOO_SMALL);
  55.     }

  56.   n = (slen / 3) * 3;

  57.   for (i = 0, p = dst; i < n; i += 3)
  58.     {
  59.       C1 = *src++;
  60.       C2 = *src++;
  61.       C3 = *src++;

  62.       *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
  63.       *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
  64.       *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F];
  65.       *p++ = base64_enc_map[C3 & 0x3F];
  66.     }

  67.   if (i < slen)
  68.     {
  69.       C1 = *src++;
  70.       C2 = ((i + 1) < slen) ? *src++ : 0;

  71.       *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
  72.       *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];

  73.       if ((i + 1) < slen)
  74.     *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];
  75.       else
  76.     *p++ = '=';

  77.       *p++ = '=';
  78.     }
  79.   *dlen = p - dst;
  80.   *p = 0;
  81.   return (0);
  82. }

  83. /*
  84. * Decode a base64-formatted buffer
  85. */
  86. int
  87. base64_decode (const unsigned char *src, int slen, unsigned char *dst,
  88.      int *dlen)
  89. {
  90.   int i, j, n;
  91.   unsigned long x;
  92.   unsigned char *p;

  93.   for (i = j = n = 0; i < slen; i++)
  94.     {
  95.       if ((slen - i) >= 2 && *(src + i) == 'r' && *(src + i + 1) == 'n')
  96.     continue;

  97.       if (*(src + i) == 'n')
  98.     continue;

  99.       if (*(src + i) == '=' && ++j > 2)
  100.     return (XYSSL_ERR_BASE64_INVALID_CHARACTER);

  101.       if (*(src + i) > 127 || base64_dec_map[*(src + i)] == 127)
  102.     return (XYSSL_ERR_BASE64_INVALID_CHARACTER);

  103.       if (base64_dec_map[*(src + i)] < 64 && j != 0)
  104.     return (XYSSL_ERR_BASE64_INVALID_CHARACTER);

  105.       n++;
  106.     }

  107.   if (n == 0)
  108.     return (0);

  109.   n = ((n * 6) + 7) >> 3;

  110.   if (*dlen < n)
  111.     {
  112.       *dlen = n;
  113.       return (XYSSL_ERR_BASE64_BUFFER_TOO_SMALL);
  114.     }

  115.   for (j = 3, n = x = 0, p = dst; i > 0; i--, src++)
  116.     {
  117.       if (*src == 'r' || *src == 'n')
  118.     continue;

  119.       j -= (base64_dec_map[*src] == 64);
  120.       x = (x << 6) | (base64_dec_map[*src] & 0x3F);

  121.       if (++n == 4)
  122.     {
  123.      n = 0;
  124.      if (j > 0)
  125.      *p++ = (unsigned char) (x >> 16);
  126.      if (j > 1)
  127.      *p++ = (unsigned char) (x >> 8);
  128.      if (j > 2)
  129.      *p++ = (unsigned char) (x);
  130.     }
  131.     }

  132.   *dlen = p - dst;

  133.   return (0);
  134. }
Base64编码是从二进制到字符的过程,像一些中文字符用不同的编码转为二 进制时,产生的二进制是不一样的,所以最终产生的Base64字符也不一样。例如"上网"对应utf-8格式的Base64编码是"5LiK572R", 对应GB2312格式的Base64编码是"yc/N+A=="。

也就是说对于一串包含中文字符的字符串,运行上述base64编码可能会有两种结果,针对这种情况可以使用CChineseCode处理
CChineseCode.rar(在c++项目中直接加入即可)

Base64编码原理可见http://www.cnblogs.com/luguo3000/p/3940197.html

阅读(1787) | 评论(0) | 转发(0) |
0

上一篇:c++ 字符串使用

下一篇:CMakeLists 使用

给主人留下些什么吧!~~