📄 base64tool.cpp
字号:
#include "base64Tool.h"
#include <memory>
const char g_szBASE64CODE[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
void Base64Tool::Encode ( const char * pszin, int nLen, std::string & szout )
{
if ( pszin == 0 || nLen <= 0 )
return;
int nRemainLen = 0;
int nOutLen = nLen * 4 / 3 + 4;
int nidx = 0;
int i = 0;
char * pchOut = new char [nOutLen];
unsigned char ch;
char chRemain = 0;
std::auto_ptr < char > autoDel ( pchOut );
memset ( pchOut, 0, nOutLen );
for ( int m = 0; m < nLen; )
{
if ( nRemainLen < BASECODE_LEN )
{
ch = pszin[m++];
char chCode = (ch >> (8-(BASECODE_LEN-nRemainLen)) ) & 0x3f;
pchOut[nidx++] = ENCODE_BYTE((chRemain << (BASECODE_LEN - nRemainLen) | chCode));
chRemain = 0;
for ( i = 0; i < (8 - ( BASECODE_LEN - nRemainLen )); i++ )
{
chRemain <<= 1;
chRemain |= 0x01;
}
chRemain &= ch;
nRemainLen += 2;
}
else
{
pchOut[nidx++] = ENCODE_BYTE( chRemain );
nRemainLen = 0;
chRemain = 0;
}
}
if (nRemainLen > 0){
if ( nRemainLen < BASECODE_LEN )
{
chRemain <<= ( BASECODE_LEN - nRemainLen );
pchOut[nidx++] = ENCODE_BYTE( chRemain );
for ( int i = 0; i < ( BASECODE_LEN - nRemainLen ); i += 2 )
{
pchOut[nidx++] = PAD_CHAR;
}
}
else
{
pchOut[nidx++] = ENCODE_BYTE( chRemain );
}
}
pchOut[nidx] = '\0';
szout = pchOut;
}
int Base64Tool::Decode ( const std::string & szin, char * pszOut, int & nOutLen )
{
int nInLen = szin.length();
int nLen = 0;
int nRemainLen = 0;
int i;
unsigned char ch = 0;
char chRemain = 0;
char * pszTmpOut = new char [ nInLen * 3 / 4 + 3];
std::auto_ptr < char > autoDel ( pszTmpOut );
std::basic_string < char >::const_iterator it = szin.begin ();
for ( ; it != szin.end (); )
{
ch = *it++;
if ( ch == PAD_CHAR )
continue;
ch = DecodeValue ( ch );
if ( nRemainLen == 0 )
{
chRemain = ch;
}
else
{
char chTmp = ch;
ch >>= ( BASECODE_LEN - nRemainLen );
chRemain <<= nRemainLen;
chRemain |= ch;
pszTmpOut[nLen++] = chRemain;
chRemain = 0;
for ( i = 0; i < (BASECODE_LEN - nRemainLen); i++)
{
chRemain <<= 1;
chRemain |= 0x01;
}
chRemain &= chTmp;
}
nRemainLen += 2;
if ( nRemainLen > BASECODE_LEN )
nRemainLen = 0;
}
if ( nOutLen >= nLen )
{
nOutLen = nLen;
memcpy ( pszOut, pszTmpOut, nLen);
}
else
{
nOutLen = nLen;
return -1;
}
return 0;
}
int Base64Tool::DecodeValue ( const char c )
{
if ('A' <= c && c <= 'Z')
return c - 'A';
if ('a' <= c && c <= 'z')
return c - 'a' + 26;
if ('0' <= c && c <= '9')
return c - '0' + 52;
if (c == '+')
return 62;
if (c == '/')
return 63;
if (c == PAD_CHAR)
return -1;
return -2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -