📄 base64.cpp
字号:
// base64.cpp: implementation of the Cbase64 class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "base64.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Cbase64::Cbase64()
{
}
Cbase64::~Cbase64()
{
}
int Cbase64::Encode(char *Inbuf, char *Outbuf, int nInLen, int nOutLen)
{
char table[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
unsigned char c80,c81,c82,c6;
int i,k,len;
if((nInLen*4)>(nOutLen*3+3))
return 1;
k=nInLen/3;
len=k*4;//real outpur string length
for(i=0;i<k;i++)
{
c80=Inbuf[i*3];
c6= c80 >> 2;
Outbuf[i*4]=table[c6 & 0x3f];
c80 = (c80<<4) & 0x30;
c81 = Inbuf[i*3+1];
c6 = (c81>>4) & 0x0f;
Outbuf[i*4+1]=table[c80 | c6];
c81 = (c81<<2) & 0x3c;
c82 = Inbuf[i*3+2];
c6 = (c82>>6) & 0x03;
Outbuf[i*4+2]=table[c81 | c6];
Outbuf[i*4+3]=table[c82 & 0x3f];
}
i=nInLen%3;
k=nInLen/3;
if(i)//some more.
{
len+=4;
c80=Inbuf[k*3];
c6= c80 >> 2;
Outbuf[k*4]=table[c6 & 0x3f];
if(k==1)
{
c80 = (c80<<4) & 0x30;
Outbuf[k*4+1]=table[c80];
Outbuf[k*4+2]='=';
}
else
{
c80 = (c80<<4) & 0x30;
c81 = Inbuf[k*3+1];
c6 = (c81>>4) & 0x0f;
Outbuf[k*4+1]=table[c80 | c6];
c81 = (c81<<2) & 0x3c;
Outbuf[k*4+2]=table[c81];
}
Outbuf[k*4+3]='=';
}//end of some more.
Outbuf[len]='\0';
return len;
}
int Cbase64::Decode(char *Inbuf, char *Outbuf, int nInLen, int nOutLen)
{
int nbytesdecoded;
char *pBufin;
unsigned char *pszBufout;
unsigned char szBufout[256];
char szBufTmp[350];
int nprbytes;
DWORD dwCoded=nInLen;
char *pszCoded=Inbuf;
char *pszDecoded=Outbuf;
const int pr2six[256]={
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,62,64,64,64,63,
52,53,54,55,56,57,58,59,60,61,64,64,64,64,64,64,64,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,64,64,64,64,64,64,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,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64
};
//
// Remove leading whitespace.
//
while( ( dwCoded > 0 ) && ( isspace( *pszCoded ) ) )
{
pszCoded++; dwCoded--;
}
if ( dwCoded > ( 350 - 4 ) )
return 1;
strncpy(szBufTmp, pszCoded, dwCoded);
szBufTmp[dwCoded] = szBufTmp[dwCoded+1] = szBufTmp[dwCoded+2]
= szBufTmp[dwCoded+3] = 0;
//
// Determine how many characters are in the input buffer.
// If this would decode into more bytes than would fit into
// the output buffer, return 2
//
pBufin = szBufTmp;
while( pr2six[ *( pBufin++ ) ] <= 63 );
nprbytes = pBufin - szBufTmp - 1;
nbytesdecoded = ( ( nprbytes + 3 ) / 4 ) * 3;
if(nOutLen<nbytesdecoded)
return 2;
if ( nbytesdecoded > (256 - 4) )
return 2;
pszBufout = (unsigned char *) szBufout;
pBufin = szBufTmp;
while (nprbytes > 0) {
*(pszBufout++) =
(unsigned char) (pr2six[*pBufin] << 2 | pr2six[pBufin[1]] >> 4);
*(pszBufout++) =
(unsigned char) (pr2six[pBufin[1]] << 4 | pr2six[pBufin[2]] >> 2);
*(pszBufout++) =
(unsigned char) (pr2six[pBufin[2]] << 6 | pr2six[pBufin[3]]);
pBufin += 4;
nprbytes -= 4;
}
if(nprbytes & 03) {
if(pr2six[pBufin[-2]] > 63)
nbytesdecoded -= 2;
else
nbytesdecoded -= 1;
}
szBufout[nbytesdecoded] = '\0';
strcpy(pszDecoded, (char*)szBufout);
return nbytesdecoded;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -