base64初探

来源:互联网 发布:免费电子相册制作软件 编辑:程序博客网 时间:2024/05/01 12:30

申明本文部分内容为网络相关资料整理,并结合本人实际工作总结而成。请引用或者转载注明出处,对于文章内容有疑问请留言。

一、原理

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。


转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,缓冲区中剩下的bit用0补足。然后,每次取出6(因为2^6=64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。


如果最后剩下两个byte,在编码结果后加1个=;如果最后剩下一个byte,编码结果后加2个=;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。


二、示例


三、代码(借鉴)

/** * * base64 编码/解码 未进行任何数据检查 * * */ #include <iostream>#include <string>#include <map> using namespace std; static char encode[64]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N',                        'O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b',                        'c','d','e','f','g','h','i','j','k','l','m','n','o','p',                        'q','r','s','t','u','v','w','x','y','z','0','1','2','3',                        '4','5','6','7','8','9','+','/'};static map<char,unsigned> decode; void initData(){    for (unsigned i(0);i!=64;++i){        decode[encode[i]]=i;    }} // base64编码,三变四void encodeAppend(const string::const_iterator& it, string& str){    unsigned raw(((unsigned)*it & 0xff)<<16 |                  ((unsigned)*(it+1) & 0xff)<<8 |                  ((unsigned)*(it+2) & 0xff));    for (int i(18);i>=0;i-=6){        str+=encode[raw>>i & 63];    }} string& base64Encode(string strRaw,string& str){    str.clear();    // 补'='个数    unsigned plusEq(0);     // 补0到长度为3的倍数    while (strRaw.size() % 3){        strRaw+=(char)0;        ++plusEq;    }     string::const_iterator it(strRaw.begin());    unsigned count(0);    while (it != strRaw.end()){        encodeAppend(it,str);        // 每76个字符换行,每次增加4个字符所以每19轮换行一次        if (++count%19 == 0){            str+='\n';        }        it+=3;    }     // 修改'='    while (plusEq){        str[str.size()-plusEq]='=';        --plusEq;    }         return str;} // base64解码,四变三void decodeAppend(const string::const_iterator& it,string& str){    unsigned raw(decode[*it]<<18 |                  decode[*(it+1)]<<12 |                 decode[*(it+2)]<<6 |                 decode[*(it+3)]);    for (int i(16);i>=0;i-=8){        str+=(char)(raw>>i);    }} string& base64Decode(const string& strRaw,string& str){    str.clear();    for (string::const_iterator it(strRaw.begin());it!=strRaw.end();it+=4){        decodeAppend(it,str);    }    return str;} int main(){     initData();    string strRaw,str;     cout<<endl<<"输入原码:"<<endl;    getline(cin,strRaw);    cout<<"base64 Encode:"<<endl        <<base64Encode(strRaw,str)<<endl;     cout<<endl<<"输入base64:"<<endl;    getline(cin,strRaw);    cout<<"base64 Decode:"<<endl        <<base64Decode(strRaw,str)<<endl;     return 0;}


原创粉丝点击