Base64编码与解码的C++
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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