Base64编码与解码的C++

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Base64编码与解码的C++2009年03月18日 星期三 22:24/************************************************
头文件ZBase64.h
************************************************/

#ifndef _ZBASE64
#define _ZBASE64

#pragma warning(disable:4786)
#include
using namespace std;

class ZBase64
{

private:

//Base64编码解码表
char* m_Base64_Table;

public:

//构造
ZBase64();

//编码
string EncodeBase64(const string strSource);

//解码
string DecodeBase64(const string strSource);
};
#endif

/************************************************
实现文件ZBase64.cpp
************************************************/

#include "stdAfx.h"
#include "ZBase64.h"

ZBase64::ZBase64()
{
//Base64编码表
this->m_Base64_Table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
}

string ZBase64::EncodeBase64(const string strSource)
{
/*
* 以下是操作二进制数时用到的
* 11111100 0xFC
* 11000000 0x3
* 11110000 0xF0
* 00001111 0xF
* 11000000 0xC0
* 00111111 0x3F
*/

string strEncode;
char cTemp[4];

//行长,MIME规定Base64编码行长为76字节
int LineLength=0;

for(int i=0;i{
memset(cTemp,0,4);

cTemp[0]=strSource[i];
cTemp[1]=strSource[i+1];
cTemp[2]=strSource[i+2];

int len=strlen(cTemp);
if(len==3)
{
strEncode+=this->m_Base64_Table[((int)cTemp[0] & 0xFC)>>2];
strEncode+=this->m_Base64_Table[((int)cTemp[0] & 0x3)<<4 | ((int)cTemp[1] & 0xF0)>>4];
strEncode+=this->m_Base64_Table[((int)cTemp[1] & 0xF)<<2 | ((int)cTemp[2] & 0xC0)>>6];
strEncode+=this->m_Base64_Table[(int)cTemp[2] & 0x3F];
if(LineLength+=4>=76) strEncode+="\r\n";
}
else if(len==2)
{
strEncode+=this->m_Base64_Table[((int)cTemp[0] & 0xFC)>>2];
strEncode+=this->m_Base64_Table[((int)cTemp[0] & 0x3 )<<4 | ((int)cTemp[1] & 0xF0 )>>4];
strEncode+=this->m_Base64_Table[((int)cTemp[1] & 0x0F)<<2];
if(LineLength+=4>=76) strEncode+="\r\n";
strEncode+="=";
}
else if(len==1)
{
strEncode+=this->m_Base64_Table[((int)cTemp[0] & 0xFC)>>2];
strEncode+=this->m_Base64_Table[((int)cTemp[0] & 0x3 )<<4];
if(LineLength+=4>=76) strEncode+="\r\n";
strEncode+="==";
}
memset(cTemp,0,4);
}
return strEncode;
}

string ZBase64::DecodeBase64(const string strSource)
{
//返回值
string strDecode;
char cTemp[5];

for(int i=0;i{
memset(cTemp,0,5);

cTemp[0]=strSource[i];
cTemp[1]=strSource[i+1];
cTemp[2]=strSource[i+2];
cTemp[3]=strSource[i+3];

int asc[4];
for(int j=0;j<4;j++)
{
for(int k=0;k<(int)strlen(this->m_Base64_Table);k++)
{
if(cTemp[j]==this->m_Base64_Table[k]) asc[j]=k;
}
}
if('='==cTemp[2] && '='==cTemp[3])
{
strDecode+=(char)(int)(asc[0] << 2 | asc[1] << 2 >> 6);
}
else if('='==cTemp[3])
{
strDecode+=(char)(int)(asc[0] << 2

| asc[1] << 2 >> 6);
strDecode+=(char)(int)(asc[1] << 4 | asc[2] << 2 >> 4);
}
else
{
strDecode+=(char)(int)(asc[0] << 2 | asc[1] << 2 >> 6);
strDecode+=(char)(int)(asc[1] << 4 | asc[2] << 2 >> 4);
strDecode+=(char)(int)(asc[2] << 6 | asc[3] << 2 >> 2);
}
}
return strDecode;
}

/************************************************
调用示例
************************************************/


ZBase64 base64;

string eccode=base64.EncodeBase64("hello");

//输出结果为:aGVsbG8=

string decode=base64.DecodeBase64("aGVsbG8=");

//输出结果为:hello



相关文档
最新文档