Base64

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值