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++来进行实现,具体代码如下:
若有问题,敬请斧正!!
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;
}
若有问题,敬请斧正!!