c++ base64



/*
* base64.h
*
*  Created on: 2013-1-15
*      Author: [email protected]
*/
#ifndef _BASE_64_H_
#define _BASE_64_H_
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#ifndef OUT
#define OUT
#endif
#ifndef IN
#define IN
#endif

class Base64
{
public:
    Base64()
    {
       base_table ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    }
    int base64_decode(IN const char*code,OUT string &result)
    {
        int len=strlen(code);
        int size=len /4;
        if(len % 4 !=0)
        {
            cout<<"error data format\n";
            return -1;
        }
        int alloc_size=len /4 *3;

        char *buffer=new char[alloc_size+1];
        memset(buffer,0,alloc_size+1);
        int q=0;
        for(int i=0; i<size; i++)
        {
            unsigned char p0=(unsigned char)code[4*i];
            unsigned char p1=(unsigned char)code[4*i+1];
            unsigned char p2=(unsigned char)code[4*i+2];
            unsigned char p3=(unsigned char)code[4*i+3];
            int s1=get_index(p0);
            if(s1==-1)
            {
                cout<<"error data format\n";
                return -1;
            }
            int s2=get_index(p1);
            if(s2==-1)
            {
                cout<<"error data format\n";
                return -1;
            }
            int s3=-2;
            int s4=-2;
            if(p2 =='=')
            {
                if(p3 != '=')
                {
                    cout<<"error data format\n";
                    return -1;
                }
                s3=-2;
            }
            else
            {
                s3=get_index(p2);
                if(s3==-1)
                {
                    cout<<"error data format\n";
                    return -1;
                }
            }

            if(p3=='=')
            {
                s4=-2;
            }
            else
            {
                s4=get_index(p3);
                if(s4==-1)
                {
                    cout<<"error data format\n";
                    return -1;
                }
            }

            if(s3==-2)
            {
                s2=s2 >>4;
                buffer[q]=(s1 << 2) | s2;
            }
            else
            {
                //前面前6位和中间2位
                buffer[q]=( s1<< 2 ) | ( s2 >> 4 );
                q++;
                if(s4==-2)
                {
                    s3=s3 >>2;
                    int low=	(s2 & 0xf ) << 4;
                    buffer[q]= low | s3;
                }
                else
                {
                    //前面前4位和中间4位
                    int low=(s2 & 0xf)<< 4 ;
                    int high=s3 >> 2;
                    buffer[q]= low | high;
                    q++;
                    //中间后2位和最后6位
                    low=(s3 & 0x03) << 6;
                    buffer[q]=low | s4;
                    q++;
                }
            }

        }
        result=buffer;
		alloc_size=strlen(buffer);
        delete[] buffer;
        return alloc_size;
    }


    int base64_encode(IN const  char* code, OUT string &result)
    {
        int len = strlen(code);

        int size = len / 3;
        int allocat_size=size*4  ;
        int index = 0;
        for (int i = 0; i < size; i++)
        {
            //前6位
            unsigned char p0=(unsigned char)code[index];
            unsigned char p1=(unsigned char)code[index+1];
            unsigned char p2=(unsigned char)code[index+2];
            int cur_index = p0>> 2;
            result += base_table[cur_index];
            //前2位中间4位
            cur_index = ((p0 & 0x03) << 4) | (p1>> 4);
            result += base_table[cur_index];
            //中间后4位和最后前2位
            cur_index = ((p1 & 0xf) << 2) | (p2 >> 6);
            result += base_table[cur_index];
            //最后6位
            cur_index = (p2 & 0x3f);
            result += base_table[cur_index];
            index += 3;
        }
        size =  3-len * 4 % 3 ;
        switch(size)
        {
        case 1:
        {

            unsigned char p0=(unsigned char)code[index];
            unsigned char p1=(unsigned char)code[index+1];
            //前6位
            int cur_index = (p0 >> 2 & 0x3f);
            result += base_table[cur_index];
            //前后2位和中间4位
            int high = (p0 & 0x03) << 4;
            int low = p1 >> 4 & 0x0f;
            cur_index = high | low;
            result += base_table[cur_index];
            //最后4位补1个 00 位
            high = p1<< 4 & 0xf0;
            high=high>>2;
            cur_index=high;
            result += base_table[cur_index];
            //填充一个 = 号
            result += "=";
            allocat_size+=4;
        }
        break;
        case 2:
        {
            unsigned char p0=(unsigned char)code[index];
            //前6位
            int cur_index = (p0>> 2 & 0x3f);
            result += base_table[cur_index];
            //前4位补充 2个 00 位
            cur_index = p0 & 0x03;
            cur_index = cur_index << 4;
            result += base_table[cur_index];
            result += "=";
            result += "=";
            allocat_size+=4;
        }
        break;
        default:
            break;
        }
        return allocat_size;

    }
private:
      char  *base_table   ;

    int get_index(char l)
    {
        for(int i=0; i<64; i++)
        {
            if(base_table[i]==l)
                return i;
        }
        return -1;
    }

   
};

#endif







猜你喜欢

转载自hcmfys.iteye.com/blog/1770254