#ifndef BASE64_H
#define BASE64_H
#include<iostream>
#include <string.h>
using namespace std;
class Base64
{
public:
Base64();
~Base64();
public:
char * Base64Encoding(const char * input);
char * Base64Decoding(const char * input);
private:
int GetIndexFromTabel(char symbol,const char * tabel);
char * m_pEncodingResult;
char * m_pDecodingResult;
const char * m_pTabel;
};
#endif // BASE64_H
#include "base64.h"
Base64::Base64()
{
m_pEncodingResult = nullptr;
m_pDecodingResult = nullptr;
m_pTabel ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
}
Base64:: ~Base64()
{
if(m_pDecodingResult)
{
delete[]m_pDecodingResult;
m_pDecodingResult = nullptr;
}
if(m_pEncodingResult)
{
delete[]m_pEncodingResult ;
m_pEncodingResult = nullptr;
}
}
char * Base64:: Base64Encoding(const char * input)
{
if(!input)
return 0;
int length = strlen(input);
int remain = length %3;
cout<<"length ="<<length<<"remain ="<<remain<<endl;
int size = length /3*4;
if(remain)
size +=4;
if(m_pEncodingResult)
{
delete[]m_pEncodingResult;
m_pEncodingResult = nullptr;
}
m_pEncodingResult = new char [size+1];
m_pEncodingResult[size]='\0';
int index =0;
int i= 0;
for ( i=0; i< length-remain; i+=3)
{
m_pEncodingResult[index++]=m_pTabel [ (input[i]&0xfc) >>2 ];
m_pEncodingResult[index++]=m_pTabel [ ((input[i]&0x03)<<4) | ((input[i+1]&0xf0)>>4) ];
m_pEncodingResult[index++]=m_pTabel [((input[i+1]&0x0f)<<2) | ((input[i+2]&0xc0) >>6)];
m_pEncodingResult[index++]=m_pTabel [ input[i+2]&0x3f ];
}
if(remain ==1)
{
m_pEncodingResult[index++]= m_pTabel[ ((input[i]&0xfc) >>2) ];
m_pEncodingResult[index++] =m_pTabel [( input[i]&0x03)<<4];
m_pEncodingResult[index++]='=';
m_pEncodingResult[index++]='=';
}
if(remain ==2)
{
m_pEncodingResult[index++]= m_pTabel[((input[i]&0xfc) >> 2)];
m_pEncodingResult[index++]= m_pTabel[(((input[i]&0x03)<<4) | ((input[i+1]&0xf0)>>4))];
m_pEncodingResult[index++]= m_pTabel[ ((input[i+1]&0x0f)<<2)] ;
m_pEncodingResult[index++]='=';
}
return m_pEncodingResult;
}
char *Base64:: Base64Decoding(const char * input)
{
if(!input)
return 0;
int length = strlen(input);
int appendNumber = 0;
if(input[length-2]=='=')
{
appendNumber =2;
}
if(input[length-1]=='='&&input[length-2]!='=')
{
appendNumber =1;
}
int size = length /4 *3 - appendNumber;
if(m_pDecodingResult)
{
delete[]m_pDecodingResult;
m_pDecodingResult = nullptr;
}
m_pDecodingResult = new char [size+1];
m_pDecodingResult[size]='\0';
int index =0;
int arraysize = appendNumber ? length-4 : length;
int i =0;
for(i=0;i< arraysize;i+=4)
{
m_pDecodingResult[index++] = ( ((GetIndexFromTabel(input[i],m_pTabel)&0x3f)<<2) | ( (GetIndexFromTabel(input[i+1],m_pTabel)&0x30) >>4) );
m_pDecodingResult[index++] =( ((GetIndexFromTabel(input[i+1],m_pTabel)&0x0f) <<4) | ( (GetIndexFromTabel(input[i+2],m_pTabel)&0x3c) >>2));
m_pDecodingResult[index++] =( ((GetIndexFromTabel(input[i+2],m_pTabel)&0x03)<<6) | (GetIndexFromTabel(input[i+3],m_pTabel)&0x3f));
}
if(appendNumber==2)
{
m_pDecodingResult[index++]= (((GetIndexFromTabel( input[i],m_pTabel)&0x3f)<<2) | ((GetIndexFromTabel(input[i+1],m_pTabel)&0x30)>>4));
}
if(appendNumber==1)
{
m_pDecodingResult[index++]= ((GetIndexFromTabel(input[i],m_pTabel)&0x3f)<<2) | ((GetIndexFromTabel(input[i+1],m_pTabel)&0x30)>>4);
m_pDecodingResult[index++]= ((GetIndexFromTabel(input[i+1],m_pTabel)&0x0f)<<4) | ((GetIndexFromTabel(input[i+2],m_pTabel)&0x3c)>>2);
}
return m_pDecodingResult;
}
int Base64::GetIndexFromTabel(char symbol,const char * tabel)
{
const char * pTabel = tabel;
int index =0;
while (pTabel) {
if(*pTabel== symbol)
{
return index;
}
index++;
pTabel++;
}
return -1;
}