`
dato0123
  • 浏览: 911007 次
文章分类
社区版块
存档分类
最新评论

Base64编解码(C++版)

 
阅读更多
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->#include<string>
usingnamespacestd;

classZBase64
{
public:
/*编码
DataByte
[in]输入的数据长度,以字节为单位
*/
stringEncode(constunsignedchar*Data,intDataByte);
/*解码
DataByte
[in]输入的数据长度,以字节为单位
OutByte
[out]输出的数据长度,以字节为单位,请不要通过返回值计算
输出数据的长度
*/
stringDecode(constchar*Data,intDataByte,int&OutByte);
};

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->#include"stdAfx.h"
#include
"ZBase64.h"

stringZBase64::Encode(constunsignedchar*Data,intDataByte)
{
//编码表
constcharEncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
//返回值
stringstrEncode;
unsigned
charTmp[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):

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->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;
}

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->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);
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics