1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Base64编解码(C++版)

Base64编解码(C++版)

时间:2024-01-31 23:02:10

相关推荐

Base64编解码(C++版)

#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);

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。