Base64基础知识可以参考此文章,非常详细:http://blog.youkuaiyun.com/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;
}