#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);
};
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;
}
#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;
}
{ // 对图片进行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);
}
{ // 对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);
}
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
本博客遵从
Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。