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