⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 base64tool.cpp

📁 实现base64编解码
💻 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 + -