Base64基础知识可以参考此文章,非常详细:http://blog.csdn.net/morewindows/article/details/11871429
转换为Base64,输入数据必须以三个字节为一组,转为为4个字节的可视字符。下面主要是根据下图的映射表就行编程:
以下代码实现了Base64的编码规则
#include <bitset> #include <iostream> #include <string> #include <vector> #include <list> using namespace std; int main( int argc, char ** argv ){ //原始数据 unsigned char data[] ={0xb3, 0x7a, 0x4f, 0x2c, 0xc0, 0x62, 0x4f, 0x16, 0x90 ,0xf6,0x46, 0x06, 0xcf, 0x38, 0x59, 0x45, 0xb2, 0xbe, 0xc4, 0xea}; // 把data数据转换为对应的 bitset list< bitset<8> > bits; for( auto c : data ){ bitset<8> bit(c); bits.push_back(bit); } //输入数据必须是3的倍数,不够使用0补充。 while( bits.size() % 3 != 0 ) bits.push_back( bitset<8>() ); //base64编码映射表 const unsigned char bt[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','+','/' }; vector<unsigned char> base64; while( !bits.empty() ){ //每次循环,3个八字节转换为4个6字节。参考上图。 bitset<6> bit6_1,bit6_2,bit6_3,bit6_4; bitset<8> bit8_1 = *bits.begin(); bits.pop_front(); bitset<8> bit8_2 = *bits.begin(); bits.pop_front(); bitset<8> bit8_3 = *bits.begin(); bits.pop_front(); bit6_1.set(0, bit8_1[2]); bit6_1.set(1, bit8_1[3]); bit6_1.set(2, bit8_1[4]); bit6_1.set(3, bit8_1[5]); bit6_1.set(4, bit8_1[6]); bit6_1.set(5, bit8_1[7]); bit6_2.set(0, bit8_2[4]); bit6_2.set(1, bit8_2[5]); bit6_2.set(2, bit8_2[6]); bit6_2.set(3, bit8_2[7]); bit6_2.set(4, bit8_1[0]); bit6_2.set(5, bit8_1[1]); bit6_3.set(0, bit8_3[6]); bit6_3.set(1, bit8_3[7]); bit6_3.set(2, bit8_2[0]); bit6_3.set(3, bit8_2[1]); bit6_3.set(4, bit8_2[2]); bit6_3.set(5, bit8_2[3]); bit6_4.set(0, bit8_3[0]); bit6_4.set(1, bit8_3[1]); bit6_4.set(2, bit8_3[2]); bit6_4.set(3, bit8_3[3]); bit6_4.set(4, bit8_3[4]); bit6_4.set(5, bit8_3[5]); base64.push_back( bt[bit6_1.to_ulong() ]); base64.push_back( bt[bit6_2.to_ulong() ]); base64.push_back( bt[bit6_3.to_ulong() ]); base64.push_back( bt[bit6_4.to_ulong() ]); } //转换为字符串打印 string strdata(base64.begin(),base64.end()); cout<<strdata<<endl; return 0; }