/*Base64.h*/
#ifndef __BASE64_H
#define __BASE64_H
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <string>
class CBase64
{
public:
CBase64(void);
~CBase64(void);
static std::string Decode( const std::string& data );
static std::string Encode( const std::string& data );
};
#endif // __BASE64_H
============================================================================
/*Base64.cpp*/
#include "Base64.h"
#include <stdio.h>
using namespace std;
static const char fillchar = '=';
static const string::size_type np = string::npos;
static const string Base64Table("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
// Decode Table gives the index of any valid base64 character in the Base64 table]
// 65 == A, 97 == a, 48 == 0, 43 == +, 47 == /
// 0 1 2 3 4 5 6 7 8 9
const string::size_type DecodeTable[] = {np,np,np,np,np,np,np,np,np,np, // 0 - 9
np,np,np,np,np,np,np,np,np,np, //10 -19
np,np,np,np,np,np,np,np,np,np, //20 -29
np,np,np,np,np,np,np,np,np,np, //30 -39
np,np,np,62,np,np,np,63,52,53, //40 -49
54,55,56,57,58,59,60,61,np,np, //50 -59
np,np,np,np,np, 0, 1, 2, 3, 4, //60 -69
5, 6, 7, 8, 9,10,11,12,13,14, //70 -79
15,16,17,18,19,20,21,22,23,24, //80 -89
25,np,np,np,np,np,np,26,27,28, //90 -99
29,30,31,32,33,34,35,36,37,38, //100 -109
39,40,41,42,43,44,45,46,47,48, //110 -119
49,50,51,np,np,np,np,np,np,np, //120 -129
np,np,np,np,np,np,np,np,np,np, //130 -139
np,np,np,np,np,np,np,np,np,np, //140 -149
np,np,np,np,np,np,np,np,np,np, //150 -159
np,np,np,np,np,np,np,np,np,np, //160 -169
np,np,np,np,np,np,np,np,np,np, //170 -179
np,np,np,np,np,np,np,np,np,np, //180 -189
np,np,np,np,np,np,np,np,np,np, //190 -199
np,np,np,np,np,np,np,np,np,np, //200 -209
np,np,np,np,np,np,np,np,np,np, //210 -219
np,np,np,np,np,np,np,np,np,np, //220 -229
np,np,np,np,np,np,np,np,np,np, //230 -239
np,np,np,np,np,np,np,np,np,np, //240 -249
np,np,np,np,np,np}; //250 -256
CBase64::CBase64(void)
{
}
CBase64::~CBase64(void)
{
}
string CBase64::Encode(const string& data)
{
string::size_type i;
char c;
string::size_type len = data.length();
string ret;
ret.reserve(len * 2);
for (i = 0; i < len; ++i)
{
c = (data[i] >> 2) & 0x3f;
ret.append(1, Base64Table[c]);
c = (data[i] << 4) & 0x3f;
if (++i < len)
c |= (data[i] >> 4) & 0x0f;
ret.append(1, Base64Table[c]);
if (i < len)
{
c = (data[i] << 2) & 0x3f;
if (++i < len)
c |= (data[i] >> 6) & 0x03;
ret.append(1, Base64Table[c]);
}
else
{
++i;
ret.append(1, fillchar);
}
if (i < len)
{
c = data[i] & 0x3f;
ret.append(1, Base64Table[c]);
}
else
{
ret.append(1, fillchar);
}
}
return(ret);
}
string CBase64::Decode(const string& data)
{
string::size_type i;
char c;
char c1;
string::size_type len = data.length();
string ret;
ret.reserve(len);
for (i = 0; i < len; ++i)
{
c = (char) DecodeTable[(unsigned char)data[i]];
++i;
c1 = (char) DecodeTable[(unsigned char)data[i]];
c = (c << 2) | ((c1 >> 4) & 0x3);
ret.append(1, c);
if (++i < len)
{
c = data[i];
if (fillchar == c)
break;
c = (char) DecodeTable[(unsigned char)data[i]];
c1 = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf);
ret.append(1, c1);
}
if (++i < len)
{
c1 = data[i];
if (fillchar == c1)
break;
c1 = (char) DecodeTable[(unsigned char)data[i]];
c = ((c << 6) & 0xc0) | c1;
ret.append(1, c);
}
}
return(ret);
}