#ifndef BASE_64_MODEL
#define BASE_64_MODEL
const char EncodeSymbol[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\+=";//26*2=52+10=62
const DWORD DwordChar[]={0x00FC0000,0x0003F000,0x00000FC0,0x0000003F};
class CMyBase64
{
public:
CString EnCode(BYTE *pBuf,int codeLen,int rLen)
{
char *pStr=(char*)malloc((codeLen/3*4)+2);
char *OldpStr=pStr;
memset(pStr,0,(codeLen/3*4)+2);
char ch[5]={0};
DWORD temp=0;
if(pBuf==NULL)//pBuf 溢出程序会崩溃,这里不做溢出检测
{
return "";
}
while(codeLen>=3)
{
memcpy(&temp,pBuf,sizeof(char)*3);
pBuf+=3;
codeLen-=3;
*pStr=EncodeSymbol[(temp&DwordChar[0])>>18];
*(pStr+1)=EncodeSymbol[(temp&DwordChar[1])>>12];
*(pStr+2)=EncodeSymbol[(temp&DwordChar[2])>>6];
char ci=(temp&DwordChar[3]);
*(pStr+3)=EncodeSymbol[ci];
pStr+=4;
}
if(codeLen%3==2)//剩余两个补一个
{
temp=0;
memcpy(&temp,pBuf,sizeof(char)*2);
*pStr=EncodeSymbol[(temp&DwordChar[1])>>12];
*(pStr+1)=EncodeSymbol[(temp&DwordChar[2])>>6];
*(pStr+2)=EncodeSymbol[(temp&DwordChar[3])];
*(pStr+3)=EncodeSymbol[64];
}else if(codeLen%3==1)//补两个
{
temp=0;
memcpy(&temp,pBuf,sizeof(char)*2);
*pStr=EncodeSymbol[(temp&DwordChar[2])>>6];
*(pStr+1)=EncodeSymbol[(temp&DwordChar[3])];
*(pStr+2)=EncodeSymbol[64];
*(pStr+3)=EncodeSymbol[64];
}
return OldpStr;
}
int DnCode(CString strCode,BYTE *buf)//buf 溢出程序将崩溃
{
static BYTE DATA_ASCII2BIN[128] = {0};
if(buf==NULL)
{
return -1;
}
for(int i=0;i<64;i++)//制作解码序列
{
DATA_ASCII2BIN[EncodeSymbol[i]]=i;
}
int strLen=strCode.GetLength(), DecodeLen=0,iCount=0;
DecodeLen=(strLen/4*3);
char *cp=strCode.GetBuffer(strLen);
if(strCode.GetAt(strLen-2)==EncodeSymbol[64])//缺两个
{
DecodeLen-=2;
}else if(strCode.GetAt(strLen-1)==EncodeSymbol[64])//缺一个
{
DecodeLen--;
}
DWORD temp=0;
while (iCount<DecodeLen/3)
{
temp=DATA_ASCII2BIN[*cp]<<18;
temp|=DATA_ASCII2BIN[*(cp+1)]<<12;
temp|=DATA_ASCII2BIN[*(cp+2)]<<6;
temp|=DATA_ASCII2BIN[*(cp+3)];
cp+=4;
iCount+=1;
memcpy(buf,&temp,4*sizeof(char));
buf+=3;
}
if(DecodeLen%3==2)//缺两个
{
temp=DATA_ASCII2BIN[*cp]<<12;
temp|=DATA_ASCII2BIN[*(cp+1)]<<6;
temp|=DATA_ASCII2BIN[*(cp+2)];
memcpy(buf,&temp,2*sizeof(char));
}else if(DecodeLen%3==1)//缺一个
{
temp=DATA_ASCII2BIN[*cp]<<6;
temp|=DATA_ASCII2BIN[*(cp+1)];
memcpy(buf,&temp,sizeof(char));
}
return DecodeLen;
}
};
#endif
应用代码示列:
void CMyBase64Dlg::OnBtnEncode()
{
// TODO: Add your control notification handler code here
if(IsDlgButtonChecked(IDC_ChkText)==BST_CHECKED)
{
CString str;
GetDlgItemText(IDC_EditSource,str);
SetDlgItemText(IDC_Edit2, m_bs64.EnCode((BYTE*)str.GetBuffer(str.GetLength()),str.GetLength(),0));
}else
{
CFile cf;
if(cf.Open(m_strFileName,CFile::modeRead|CFile::typeBinary))
{
TRACE("len=%d\n",cf.GetLength());
BYTE *pTest,*oldP;
pTest=new BYTE[cf.GetLength()];
memset(pTest,0,cf.GetLength());
oldP=pTest;
int readLen=cf.Read(pTest,cf.GetLength());
// TRACE("%s",*pTest);
SetDlgItemText(IDC_Edit2,m_bs64.EnCode(oldP,cf.GetLength(),0));
cf.Close();
delete pTest;
pTest=NULL;
}
return ;
}
}
void CMyBase64Dlg::OnBtnDeCode()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItemText(IDC_Edit2,str);
char test[1024]={0};
m_bs64.DnCode(str,(BYTE*)test);
SetDlgItemText(IDC_EditSource,test);
}
void CMyBase64Dlg::OnBtnDecodeToFile()
{
// TODO: Add your control notification handler code here
//定义文本文件
CStdioFile file;
//打开写入的文件
if(! file.Open("c:\\Base64.rar",
CFile::modeCreate
|CFile::modeNoTruncate
|CFile::modeReadWrite|CFile::typeBinary
))
{
TRACE("打开文件失败\n");
return ;
}
CString str;
GetDlgItemText(IDC_Edit2,str);
BYTE *pTest=NULL;
pTest= (BYTE*)malloc(str.GetLength()/4*3);
int len=m_bs64.DnCode(str,pTest);
file.Write(pTest,len);
file.Flush();
file.Close();
// delete pTest;
// pTest=NULL;
return ;
}
void CMyBase64Dlg::OnOpen()
{
// TODO: Add your control notification handler code here
CFileDialog cf(TRUE);
cf.DoModal();
m_strFileName= cf.GetPathName();
SetDlgItemText(IDC_StaticFIle,m_strFileName);
}
声明
导入头文件 #include "Base64Modle.h"
CString m_strFileName;
CMyBase64 m_bs64;
应用截图