C++实现BASE64码编解码



原文:http://blog.csdn.net/chenxiaohua/archive/2009/04/16/4084602.aspx

概述:base64可以将不可显示的编码转换成可显示的编码,以便于存储。
比如http一般传输的是文本格式的报文,如果要传输图片,那么就要先将图片编码成base64的报文传输,然后在客客户端显示的时候,将base64的报文解密,转换成二进制的图片数据显示。
下面给出源代码,可以直接在linux,msvc环境下进行编译。 

 

  1. #ifndef ___BASE64_H___  
  2. #define ___BASE64_H___  
  3.   
  4.   
  5. #include <string>  
  6.   
  7. using namespace std;  
  8.   
  9. class CBase64  
  10. {  
  11. public:  
  12.     CBase64();  
  13.     ~CBase64();  
  14.   
  15.     /********************************************************* 
  16.     * 函数说明:将输入数据进行base64编码 
  17.     * 参数说明:[in]pIn      需要进行编码的数据 
  18.                 [in]uInLen  输入参数的字节数 
  19.                 [out]strOut 输出的进行base64编码之后的字符串 
  20.     * 返回值  :true处理成功,false失败 
  21.     * 作  者  :ChenLi 
  22.     * 编写时间:2009-02-17 
  23.     **********************************************************/  
  24.     bool static Encode(const unsigned char *pIn, unsigned long uInLen, string& strOut);  
  25.   
  26.     /********************************************************* 
  27.     * 函数说明:将输入数据进行base64编码 
  28.     * 参数说明:[in]pIn          需要进行编码的数据 
  29.                 [in]uInLen      输入参数的字节数 
  30.                 [out]pOut       输出的进行base64编码之后的字符串 
  31.                 [out]uOutLen    输出的进行base64编码之后的字符串长度 
  32.     * 返回值  :true处理成功,false失败 
  33.     * 作  者  :ChenLi 
  34.     * 编写时间:2009-02-17 
  35.     **********************************************************/  
  36.     bool static Encode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen);  
  37.       
  38.     /********************************************************* 
  39.     * 函数说明:将输入数据进行base64解码 
  40.     * 参数说明:[in]strIn        需要进行解码的数据 
  41.                 [out]pOut       输出解码之后的节数数据 
  42.                 [out]uOutLen    输出的解码之后的字节数长度 
  43.     * 返回值  :true处理成功,false失败 
  44.     * 作  者  :ChenLi 
  45.     * 编写时间:2009-02-17 
  46.     **********************************************************/  
  47.     bool static Decode(const string& strIn, unsigned char *pOut, unsigned long *uOutLen) ;  
  48.   
  49.     /********************************************************* 
  50.     * 函数说明:将输入数据进行base64解码 
  51.     * 参数说明:[in]strIn        需要进行解码的数据 
  52.                 [out]pOut       输出解码之后的节数数据 
  53.                 [out]uOutLen    输出的解码之后的字节数长度 
  54.     * 返回值  :true处理成功,false失败 
  55.     * 作  者  :ChenLi 
  56.     * 编写时间:2009-02-17 
  57.     **********************************************************/  
  58.     bool static Decode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen) ;  
  59. };  
  60.   
  61. #endif // ___BASE64_H___  

 

 
#include "CBase64.h"

static const char *g_pCodes =
 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

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

CBase64::CBase64()
{
}

CBase64::~CBase64()
{
}

bool CBase64::Encode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen)
{
 unsigned long i, len2, leven;
 unsigned char *p;

 if(pOut == NULL || *uOutLen == 0)
  return false;

 //ASSERT((pIn != NULL) && (uInLen != 0) && (pOut != NULL) && (uOutLen != NULL));

 len2 = ((uInLen + 2) / 3) << 2;
 if((*uOutLen) < (len2 + 1)) return false;

 p = pOut;
 leven = 3 * (uInLen / 3);
 for(i = 0; i < leven; i += 3)
 {
  *p++ = g_pCodes[pIn[0] >> 2];
  *p++ = g_pCodes[((pIn[0] & 3) << 4) + (pIn[1] >> 4)];
  *p++ = g_pCodes[((pIn[1] & 0xf) << 2) + (pIn[2] >> 6)];
  *p++ = g_pCodes[pIn[2] & 0x3f];
  pIn += 3;
 }

 if (i < uInLen)
 {
  unsigned char a = pIn[0];
  unsigned char b = ((i + 1) < uInLen) ? pIn[1] : 0;
  unsigned char c = 0;

  *p++ = g_pCodes[a >> 2];
  *p++ = g_pCodes[((a & 3) << 4) + (b >> 4)];
  *p++ = ((i + 1) < uInLen) ? g_pCodes[((b & 0xf) << 2) + (c >> 6)] : '=';
  *p++ = '=';
 }

 *p = 0; // Append NULL byte
 *uOutLen = p - pOut;
 return true;
}

bool CBase64::Encode(const unsigned char *pIn, unsigned long uInLen, string& strOut)
{
 unsigned long i, len2, leven;
 strOut = "";

 //ASSERT((pIn != NULL) && (uInLen != 0) && (pOut != NULL) && (uOutLen != NULL));

 len2 = ((uInLen + 2) / 3) << 2;
 //if((*uOutLen) < (len2 + 1)) return false;

 //p = pOut;
 leven = 3 * (uInLen / 3);
 for(i = 0; i < leven; i += 3)
 {
  strOut += g_pCodes[pIn[0] >> 2];
  strOut += g_pCodes[((pIn[0] & 3) << 4) + (pIn[1] >> 4)];
  strOut += g_pCodes[((pIn[1] & 0xf) << 2) + (pIn[2] >> 6)];
  strOut += g_pCodes[pIn[2] & 0x3f];
  pIn += 3;
 }

 if (i < uInLen)
 {
  unsigned char a = pIn[0];
  unsigned char b = ((i + 1) < uInLen) ? pIn[1] : 0;
  unsigned char c = 0;

  strOut += g_pCodes[a >> 2];
  strOut += g_pCodes[((a & 3) << 4) + (b >> 4)];
  strOut += ((i + 1) < uInLen) ? g_pCodes[((b & 0xf) << 2) + (c >> 6)] : '=';
  strOut += '=';
 }

 //*p = 0; // Append NULL byte
 //*uOutLen = p - pOut;
 return true;
}

bool CBase64::Decode(const string& strIn, unsigned char *pOut, unsigned long *uOutLen)
{
 unsigned long t, x, y, z;
 unsigned char c;
 unsigned long g = 3;

 //ASSERT((pIn != NULL) && (uInLen != 0) && (pOut != NULL) && (uOutLen != NULL));

 for(x = y = z = t = 0; x < strIn.length(); x++)
 {
  c = g_pMap[strIn[x]];
  if(c == 255) continue;
  if(c == 254) { c = 0; g--; }

  t = (t << 6) | c;

  if(++y == 4)
  {
   if((z + g) > *uOutLen) { return false; } // Buffer overflow
   pOut[z++] = (unsigned char)((t>>16)&255);
   if(g > 1) pOut[z++] = (unsigned char)((t>>8)&255);
   if(g > 2) pOut[z++] = (unsigned char)(t&255);
   y = t = 0;
  }
 }

 *uOutLen = z;
 return true;
}

// BASE64.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "CBase64.h"

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
 unsigned long len = 10;

 unsigned char pIn[100];
 unsigned char pOut[100];

 memcpy(pIn,"你好",5);

 string strout;

 cout<<(char*)pIn<<endl;
 if(CBase64::Encode(pIn, 4, strout))
  cout<<strout<<endl;
 else
  cout<<"加密失败"<<endl;

 string stroIn = strout;
 cout<<stroIn<<endl;

 memset(pOut,0,sizeof(pOut));

 if(CBase64::Decode(stroIn, pOut, &len))
 {
  cout<<(char *)pOut<<endl;
  cout<<"len="<<strlen((char *)pOut)<<endl;
 }
 else
  cout<<"解密失败"<<endl;

 cout<<len<<endl;

 return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值