参考实现(相信我,我已经努力“优化”让它很慢了。) 代码:
// Slow64.cpp : Defines the entry point for the console application.
//
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <fstream>
#include <iterator>
#include <time.h>
using namespace std;
void Base64Encode(const vector<unsigned char>& input,vector<unsigned char>& output)
{
static const unsigned char BASE64_CODE[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz""0123456789+/";
static const unsigned char BASE64_PADDING='=';
static int LINE_COUNT=76;
unsigned int input_index,output_index;
unsigned int size=input.size();
static const string CRLF="\r\n";
output.resize(size/3*4+(size%3?4:0)+size/3*4/LINE_COUNT*CRLF.size());
for(input_index=0,output_index=0;input_index<size;input_index+=3)
{
output[output_index++]=BASE64_CODE[input[input_index]/4];
output[output_index++]=BASE64_CODE[input[input_index]%4*16
+input[input_index+1]/16];
output[output_index++]=BASE64_CODE[input[input_index+1]%16*4
+input[input_index+2]/64];
output[output_index++]=BASE64_CODE[input[input_index+2]%64];
if(output_index%(LINE_COUNT+CRLF.size())==LINE_COUNT)
{
output[output_index++]=CRLF[0];
output[output_index++]=CRLF[1];
}
}
switch(input.size()%3)
{
case 0:
break;
case 1:
output[output_index++]=BASE64_CODE[input[input_index]/4];
output[output_index++]=BASE64_CODE[input[input_index]%4*16];
output[output_index++]=BASE64_PADDING;
output[output_index++]=BASE64_PADDING;
break;
case 2:
output[output_index++]=BASE64_CODE[input[input_index]/4];
output[output_index++]=BASE64_CODE[input[input_index]%4*16+input[input_index+1]/16];
output[output_index++]=BASE64_CODE[input[input_index+1]%16*4];
output[output_index++]=BASE64_PADDING;
break;
}
}
int main(int argc, char* argv[])
{
if(argc>=2)
{
ifstream ifs(argv[1],ios::binary);
vector<unsigned char> vc;
cerr<<"reading in data ..."<<endl;
copy(istreambuf_iterator<char>(ifs),istreambuf_iterator<char>(),
back_inserter(vc));
vector<unsigned char> output;
cerr<<"start encoding data ..."<<endl;
time_t start=time(NULL);
for(int i=0;i<100;++i)
{
Base64Encode(vc,output);
output.resize(0);
}
cerr<<"end encoding data, takes "<<time(NULL)-start<<" seconds"<<endl;
}
else
{
cerr<<"USAGE: Slow64 <filename>"<<endl;
}
return 0;
}