#include<string>
usingnamespacestd;
classZBase64
{
public:
/*编码
DataByte
[in]输入的数据长度,以字节为单位
*/
stringEncode(constunsignedchar*Data,intDataByte);
/*解码
DataByte
[in]输入的数据长度,以字节为单位
OutByte
[out]输出的数据长度,以字节为单位,请不要通过返回值计算
输出数据的长度
*/
stringDecode(constchar*Data,intDataByte,int&OutByte);
};
#include"stdAfx.h"
#include"ZBase64.h"
stringZBase64::Encode(constunsignedchar*Data,intDataByte)
{
//编码表
constcharEncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
//返回值
stringstrEncode;
unsignedcharTmp[4]={0};
intLineLength=0;
for(inti=0;i<(int)(DataByte/3);i++)
{
Tmp[1]=*Data++;
Tmp[2]=*Data++;
Tmp[3]=*Data++;
strEncode+=EncodeTable[Tmp[1]>>2];
strEncode+=EncodeTable[((Tmp[1]<<4)|(Tmp[2]>>4))&0x3F];
strEncode+=EncodeTable[((Tmp[2]<<2)|(Tmp[3]>>6))&0x3F];
strEncode+=EncodeTable[Tmp[3]&0x3F];
if(LineLength+=4,LineLength==76){strEncode+="\r\n";LineLength=0;}
}
//对剩余数据进行编码
intMod=DataByte%3;
if(Mod==1)
{
Tmp[1]=*Data++;
strEncode+=EncodeTable[(Tmp[1]&0xFC)>>2];
strEncode+=EncodeTable[((Tmp[1]&0x03)<<4)];
strEncode+="==";
}
elseif(Mod==2)
{
Tmp[1]=*Data++;
Tmp[2]=*Data++;
strEncode+=EncodeTable[(Tmp[1]&0xFC)>>2];
strEncode+=EncodeTable[((Tmp[1]&0x03)<<4)|((Tmp[2]&0xF0)>>4)];
strEncode+=EncodeTable[((Tmp[2]&0x0F)<<2)];
strEncode+="=";
}
returnstrEncode;
}
stringZBase64::Decode(constchar*Data,intDataByte,int&OutByte)
{
//解码表
constcharDecodeTable[]=
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
62,//'+'
0,0,0,
63,//'/'
52,53,54,55,56,57,58,59,60,61,//'0'-'9'
0,0,0,0,0,0,0,
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,//'A'-'Z'
0,0,0,0,0,0,
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,//'a'-'z'
};
//返回值
stringstrDecode;
intnValue;
inti=0;
while(i<DataByte)
{
if(*Data!='\r'&&*Data!='\n')
{
nValue=DecodeTable[*Data++]<<18;
nValue+=DecodeTable[*Data++]<<12;
strDecode+=(nValue&0x00FF0000)>>16;
OutByte++;
if(*Data!='=')
{
nValue+=DecodeTable[*Data++]<<6;
strDecode+=(nValue&0x0000FF00)>>8;
OutByte++;
if(*Data!='=')
{
nValue+=DecodeTable[*Data++];
strDecode+=nValue&0x000000FF;
OutByte++;
}
}
i+=4;
}
else//回车换行,跳过
{
Data++;
i++;
}
}
returnstrDecode;
}
使用示例(结合CxImage库):
CStringCScanDlg::EncodeImage()
{//对图片进行Base64编码
ZBase64zBase;
//图片编码
CxImageimage;//定义一个CxImage对象
image.Load(this->m_strImgPath,CXIMAGE_FORMAT_JPG);//先装载jpg文件,需要指定文件类型
longsize=0;//得到图像大小
BYTE*buffer=0;//存储图像数据的缓冲
image.Encode(buffer,size,CXIMAGE_FORMAT_JPG);//把image对象中的图像以type类型数据copy到buffer
stringstrTmpResult=zBase.Encode(buffer,size);
CStringresult;
result=strTmpResult.c_str();
returnresult;
}
voidCScanDlg::DecodeImageData(CStringstrData)
{//对Base64编码过的数据解码并显示原图片
ZBase64zBase;
intOutByte=0;
stringstrTmpResult=zBase.Decode(strData,strData.GetLength(),OutByte);
inti,len=strTmpResult.length();
BYTE*buffer=newBYTE[len];
for(i=0;i<len;++i)
{
buffer[i]=strTmpResult[i];
}
CxImageimage(buffer,len,CXIMAGE_FORMAT_JPG);//把内存缓冲buffer中的数据构造成Image对象
delete[]buffer;
CDC*hdc=m_picture.GetDC();
m_bitmap=image.MakeBitmap(hdc->m_hDC);
HBITMAPh0ldBmp=m_picture.SetBitmap(m_bitmap);
if(h0ldBmp)DeleteObject(h0ldBmp);
if(hdc->m_hDC)m_picture.ReleaseDC(hdc);
if(m_bitmap)DeleteObject(m_bitmap);
}