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

📄 base64.cpp

📁 Base64编码算法, 可以分别对字符串和文件进行编码/解码,带进度条, 内含VC++6.0源码
💻 CPP
字号:

/*
	Copyright 2006 - 2008
	ZhangLuduo <zhangluduo@msn.com>
	All Rights Reserved.
							
	Base64 编码及解码

	作者	- 张鲁夺(zhangluduo)
	MSN		- zhangluduo@msn.com
	QQ群	- 34064264

	为所有爱我的人和我爱的人努力!
*/

#include "stdAfx.h"
#include "Base64.h"

#define for if ( 0 ) ; else for

Base64::Base64()
{
	//编码表
	m_EncodeTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

	// 建立解码表.
	for( int i = 0; i < 256; i++ ) 
		m_DecodeTable[i] = -1;								// 非法数字.
	for( int i = 0; i < 64; i++ )
	{
		m_DecodeTable[ m_EncodeTable[ i ] ]			= i;
		m_DecodeTable[ m_EncodeTable[ i ] | 0x80 ]	= i;	// 忽略8th bit.
		m_DecodeTable[ '=' ]						= -1; 
		m_DecodeTable[ '=' | 0x80 ]					= -1; 
	}
}

Base64::~Base64()
{

}

void Base64::EncodeInput1(/* in */const unsigned char pData[1], /* out */char EncodeBuf[4])
{
    EncodeBuf[0] = m_EncodeTable[(pData[0] & 0xFC) >> 2];
    EncodeBuf[1] = m_EncodeTable[((pData[0] & 0x03) << 4)];
    EncodeBuf[2] = '=';
	EncodeBuf[3] = '=';
}

void Base64::EncodeInput2(/* in */const unsigned char pData[2], /* out */char EncodeBuf[4])
{
	EncodeBuf[0] = m_EncodeTable[(pData[0] & 0xFC) >> 2];
	EncodeBuf[1] = m_EncodeTable[((pData[0] & 0x03) << 4) | ((pData[1] & 0xF0) >> 4)];
	EncodeBuf[2] = m_EncodeTable[((pData[1] & 0x0F) << 2)];
	EncodeBuf[3] = '=';
}

void Base64::EncodeInput3(/* in */const unsigned char pData[3], /* out */char EncodeBuf[4])
{
	EncodeBuf[0] = m_EncodeTable[pData[0] >> 2];
	EncodeBuf[1] = m_EncodeTable[((pData[0] << 4) | (pData[1] >> 4)) & 0x3F];
	EncodeBuf[2] = m_EncodeTable[((pData[1] << 2) | (pData[2] >> 6)) & 0x3F];
	EncodeBuf[3] = m_EncodeTable[pData[2] & 0x3F];
}

string Base64::Encode(unsigned char* pData, int DataLen)
{
	string strEncode		= "";
	char EncodeBuf[5]		= { 0 };
	unsigned char ch[3]		= { 0 };
	int LineLen				= 0;

	for(int i = 0 ; i < (int)(DataLen / 3); i++)
	{
        ch[0] = *pData ++;
        ch[1] = *pData ++;
        ch[2] = *pData ++;
		EncodeInput3(ch, EncodeBuf);
		strEncode += EncodeBuf;

		if(LineLen += 4, LineLen == 76) 
		{
			strEncode += "\r\n";
			LineLen = 0;
		}
	}

	//对剩余数据进行编码
	int Mod = DataLen % 3;
	if(Mod == 1)
	{
		memset(EncodeBuf, 0, 5);
        ch[0] = *pData++;
		EncodeInput1(ch, EncodeBuf);
		strEncode += EncodeBuf;
	}
	else if(Mod == 2)
	{
		memset(EncodeBuf, 0, 5);
		ch[0] = *pData++;
		ch[1] = *pData++;
		EncodeInput2(ch, EncodeBuf);
		strEncode += EncodeBuf;
	}
	return strEncode;
}

//	char Base64::GetDecodeChar(char ch)
//	{
//		if ((ch >= 'A') && (ch <= 'Z')) 
//			return ch - 'A'; 
//		else if ((ch >= 'a') && (ch <= 'z')) 
//			return ch - 'a' + 26; 
//		else if ((ch >= '0') && (ch <= '9')) 
//			return ch - '0' + 52; 
//		switch (ch) 
//		{ 
//		case '+': 
//			return 62; 
//		case '/': 
//			return 63; 
//		case '=': // base64 padding
//			return 0; 
//		default: 
//			return 0; 
//		}
//	}

string Base64::Decode(unsigned char* pData, int DataLen, int* nByte)
{
	if(nByte != 0)
		*nByte = 0;

	string strDecode	= "";
    int nValue			= 0;
    int i				= 0;

	while (i < DataLen)
	{
		if (*pData != '\r' && *pData != '\n')
		{
			nValue		 = m_DecodeTable[*pData ++] << 18;
			nValue		+= m_DecodeTable[*pData ++] << 12;
			// nValue		 = GetDecodeChar(*pData ++) << 18;
			// nValue		+= GetDecodeChar(*pData ++) << 12;
			strDecode	+=(nValue & 0x00FF0000) >> 16;
			if(nByte != 0)
				++ (*nByte);
			
			if (*pData != '=')
			{
				nValue		+= m_DecodeTable[*pData++] << 6;
				//nValue		+= GetDecodeChar(*pData++) << 6;
				strDecode	+= (nValue & 0x0000FF00) >> 8;
				if(nByte != 0)
					++ (*nByte);
				
				if (*pData != '=')
				{
					nValue		+= m_DecodeTable[*pData++];
					// nValue		+= GetDecodeChar(*pData++);
					strDecode	+= nValue & 0x000000FF;
					if(nByte != 0)
						++ (*nByte);
				}
			}
			i += 4;
		}
		else // 回车换行,跳过
		{
			pData ++;
			i ++;
		}
	}
	return strDecode;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -