您的位置:首页 > 编程语言 > C语言/C++

C++base64字符串转换

2016-03-04 10:28 429 查看


C++base64字符串转换

|

下面是头文件定义:

#ifndef _BASE64_H_

#define _BASE64_H_

#include<string>

using namespace std;

//#include <conf.h>

class CBase64Coder

{

private :

static char ch64[];

char* buf;

int size ;

private :

static int BinSearch(char p);

void allocMem(int NewSize);

public :

CBase64Coder();

~CBase64Coder();

const char* encode(const string& message);

const char* encode(const char* buffer,int buflen);

const char* decode(const char* buffer,int Length);

};

#endif

下面是类方法实现:

#include "CBase64Coder.h"

char CBase64Coder::ch64[] = {

'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','+','/','='

};

CBase64Coder::CBase64Coder()

{

buf = NULL;

size = 0 ;

}

CBase64Coder::~CBase64Coder()

{

if ( buf )

free(buf);

}

void CBase64Coder::allocMem(int NewSize)

{

if ( buf )

buf = (char*)realloc(buf,NewSize);

else

buf = (char*)malloc(NewSize);

memset(buf,0,NewSize);

}

const char* CBase64Coder::encode(const string& buffer)

{

return encode(buffer.c_str(),buffer.length());

}

const char* CBase64Coder::encode(const char* buffer,int buflen)

{

int nLeft = 3 - buflen%3 ;

//根据BASE64算法,总长度会变成原来的4/3倍

//所以内存分配=length*4/3并加1位作为结束符号(0)

allocMem(( buflen + nLeft )*4/3+1);

//临时变量,

char ch[4];

int i ,j;

for ( i = 0 ,j = 0; i < ( buflen - buflen%3 ); i += 3,j+= 4 )

{

ch[0] = (char)((buffer[i]&0xFC) >> 2 );

ch[1] = (char)((buffer[i]&0x03) << 4 | (buffer[i+1]&0xF0) >> 4 );

ch[2] = (char)((buffer[i+1]&0x0F) << 2 | (buffer[i+2]&0xC0) >> 6 );

ch[3] = (char)((buffer[i+2]&0x3F));

//查询编码数组获取编码后的字符

buf[j] = ch64[ch[0]];

buf[j+1] = ch64[ch[1]];

buf[j+2] = ch64[ch[2]];

buf[j+3] = ch64[ch[3]];

}

if ( nLeft == 2 )

{

ch[0] = (char)((buffer[i]&0xFC) >> 2);

ch[1] = (char)((buffer[i]&0x3) << 4 );

ch[2] = 64;

ch[3] = 64;

//查询编码数组获取编码后的字符

buf[j] = ch64[ch[0]];

buf[j+1] = ch64[ch[1]];

buf[j+2] = ch64[ch[2]];

buf[j+3] = ch64[ch[3]];

}

else if ( nLeft == 1 )

{

ch[0] = (char)((buffer[i]&0xFC) >> 2 );

ch[1] = (char)((buffer[i]&0x03) << 4 | (buffer[i+1]&0xF0) >> 4 );

ch[2] = (char)((buffer[i+1]&0x0F) << 2 );

ch[3] = 64;

//查询编码数组获取编码后的字符

buf[j] = ch64[ch[0]];

buf[j+1] = ch64[ch[1]];

buf[j+2] = ch64[ch[2]];

buf[j+3] = ch64[ch[3]];

}

return buf;

}

const char* CBase64Coder::decode(const char* buffer,int Length)

{

int length = Length;

if ( length%4 != 0 )

return NULL;

allocMem(length*3/4 + 1);

char p;

char ch[4];

int i , j ;

for ( i = 0 , j = 0 ; i < length ; i += 4 , j+= 3)

{

for ( int z = 0 ; z < 4 ; z++)

{

//采用2分法查找

p = (char)BinSearch(buffer[i+z]);

if ( p == -1 )

return NULL;

ch[z] = p;

}

buf[j] = (char)((ch[0]&0x3F) << 2 | (ch[1]&0x30) >> 4 );

buf[j+1] = (char)((ch[1]&0xF) <<4 | (ch[2]&0x3C) >>2 );

buf[j+2] = (char)((ch[2]&0x03) << 6 | (ch[3]&0x3F));

}

return buf;

}

//采用二分法查找p在ch64数组中的位置,并返回。如果找不到则返回-1

int CBase64Coder::BinSearch(char p)

{

if ( p >= 'A' && p <= 'Z' )

return (p - 'A');

else if ( p >= 'a' && p <= 'z' )

return (p - 'a' + 26);

else if ( p >= '0' && p <= '9' )

return (p - '0' + 26 + 26);

else if ( p == '+' )

return 62;

else if ( p == '/' )

return 63;

else if ( p == '=' )

return 64;

return -1;

}

参考:c++ base64 百度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: