Base64的原理及实现

       Base64算法的具体细节原理请自行搜索相关资料,本文只介绍其编码和解码的方法原理。
       Base64编码原理:
            第一步,每三个字节作为一组,一共是24位二进制数。
            第二步,将24位二进制数分为四组,每组有6位二进制。
            第三步,在每组前面加两个0(即00),扩展成32个二进制位,即四个字节。
            以上三步将3个字节扩展成4个字节。
            第四步,根据Base64的编码表将其编码,编码表请点击连接http://zh.wikipedia.org/wiki/Base64。

       若遇到字符串不是3的整数倍时,可分以下两种情况:
             1、整除多余两个字节的情况:将这二个字节的一共16个二进制位,按照上面的规则,转成三组,最后一组除了前面加两个0以外,后面也要加两个0。这样得到一个三位的 Base64编码,再在末尾补上一个"="号。
             2、整除多余两个字节的情况:将这一个字节的8个二进制位,按照上面的规则转成二组,最后一组除了前面加二个0以外,后面再加4个0。这样得到一个二位的Base64编码,再在末尾补上两个"="号。
     原理介绍完了,下面以C++来进行实现,具体代码如下:
       
#include <iostream>
#include <string>
using namespace std;

const char base64EncodeChars[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};
void base64encode(string &src,string &res)
{
	int i=0;
	char c1,c2,c3;
	int len=src.length();
	while (i<len)
	{
		c1=src[i++];
		if (i==len)
		{
			res.push_back(base64EncodeChars[c1>>2]);
			res.push_back(base64EncodeChars[(c1&0x3)<<4]);
			res.push_back('=');
			res.push_back('=');
			break;
		}
		c2=src[i++];
		if (i==len)
		{
			res.push_back(base64EncodeChars[c1>>2]);
			res.push_back(base64EncodeChars[((c1&0x03)<<4)|(c2>>4)]);
			res.push_back(base64EncodeChars[((c2&0x0f)<<2)]);
			res.push_back('=');
			break;
		}
		c3=src[i++];
		res.push_back(base64EncodeChars[c1>>2]);
		res.push_back(base64EncodeChars[((c1&0x03)<<4)|(c2>>4)]);
		res.push_back(base64EncodeChars[((c2&0x0f)<<2)|(c3>>6)]);
		res.push_back(base64EncodeChars[c3&0x3f]);
	}
}

void base64decode(string &src,string &res)
{
	string str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	int i=0;
	char c1,c2,c3,c4;
	int group=src.length();
	while (i<group)
	{
		c1=src[i++];
		c2=src[i++];
		c3=src[i++];
		c4=src[i++];
		res.push_back((str.find(c1)<<2)|((str.find(c2)&0x30)>>4));
		if (c3!='=')
		{
			res.push_back(((str.find(c2)&0x0f)<<4)|((str.find(c3)&0x3c)>>2));
		}
		if (c4!='=')
		{
			res.push_back(((str.find(c3)&0x03)<<6)|(str.find(c4)));
		}	
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	string src="Test";
	string res;
	cout<<"src:"<<src<<endl;
	base64encode(src,res);
	cout<<"base64encode:"<<res<<endl;
	string ensrc="VGVzdA";
	cout<<"encodechar:"<<ensrc<<endl;
	string  deres;
	base64decode(ensrc,deres);
	cout<<"base64decode:"<<deres<<endl;
	return 0;
}


     若有问题,敬请斧正!!
    













评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值