您的位置:首页 > 编程语言 > C语言/C++

Base64编解码(C++版)

2014-04-20 22:37 381 查看
#include <string>

using namespace std;

class ZBase64

{

public:

/*编码

DataByte

[in]输入的数据长度,以字节为单位

*/

string Encode(const unsigned char* Data,int DataByte);

/*解码

DataByte

[in]输入的数据长度,以字节为单位

OutByte

[out]输出的数据长度,以字节为单位,请不要通过返回值计算

输出数据的长度

*/

string Decode(const char* Data,int DataByte,int& OutByte);

};

#include "stdAfx.h"

#include "ZBase64.h"

string ZBase64::Encode(const unsigned char* Data,int DataByte)

{

//编码表

const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

//返回值

string strEncode;

unsigned char Tmp[4]={0};

int LineLength=0;

for(int i=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;}

}

//对剩余数据进行编码

int Mod=DataByte % 3;

if(Mod==1)

{

Tmp[1] = *Data++;

strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];

strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4)];

strEncode+= "==";

}

else if(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+= "=";

}

return strEncode;

}

string ZBase64::Decode(const char* Data,int DataByte,int& OutByte)

{

//解码表

const char DecodeTable[] =

{

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'

};

//返回值

string strDecode;

int nValue;

int i= 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++;

}

}

return strDecode;

}

使用示例(结合CxImage库):

CString CScanDlg::EncodeImage()

{//对图片进行Base64编码

ZBase64 zBase;

//图片编码

CxImage image; // 定义一个CxImage对象

image.Load(this->m_strImgPath, CXIMAGE_FORMAT_JPG); //先装载jpg文件,需要指定文件类型

long size=0;//得到图像大小

BYTE* buffer=0;//存储图像数据的缓冲

image.Encode(buffer,size,CXIMAGE_FORMAT_JPG);//把image对象中的图像以type类型数据copy到buffer

string strTmpResult=zBase.Encode(buffer,size);

CString result;

result = strTmpResult.c_str();

return result;

}

void CScanDlg::DecodeImageData(CString strData)

{//对Base64编码过的数据解码并显示原图片

ZBase64 zBase;

int OutByte=0;

string strTmpResult=zBase.Decode(strData,strData.GetLength(),OutByte);

int i,len = strTmpResult.length();

BYTE *buffer = new BYTE[len];

for (i=0;i<len;++i)

{

buffer[i] = strTmpResult[i];

}

CxImage image(buffer,len,CXIMAGE_FORMAT_JPG);//把内存缓冲buffer中的数据构造成Image对象

delete [] buffer;

CDC* hdc = m_picture.GetDC();

m_bitmap = image.MakeBitmap(hdc->m_hDC);

HBITMAP h0ldBmp = m_picture.SetBitmap(m_bitmap);

if(h0ldBmp) DeleteObject(h0ldBmp);

if(hdc->m_hDC) m_picture.ReleaseDC(hdc);

if(m_bitmap) DeleteObject(m_bitmap);

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: