/************************************************************************/
/*  Copyright (C), 2016-2020, [IT], ��������Ȩ��;
/*  ģ �� ����;
/*  ��    ����;
/*
/*  ��    ����[V];	
/*  ��    �ߣ�[IT];
/*  ��    �ڣ�[5/24/2016];
/*
/*
/*  ע    �⣺;
/*
/*  �޸ļ�¼��[IT];
/*  �޸����ڣ�;
/*  �޸İ汾��;
/*  �޸����ݣ�;
/************************************************************************/
#ifndef __BASE64_CODE__
#define __BASE64_CODE__

#pragma once

class CBase64
{
public:
	CBase64(void);
	~CBase64(void);

	/************************************************************************/
	/*  ������[5/24/2016 IT];
	/*  ��������ȡָ���ַ������ȶ�Ӧ��Base64�ַ�����;
	/*  ������;
	/*  	[IN] len��Ҫ������ַ�����;
	/*  ���أ�����ָ������len���ַ���ת��Ϊ����Base64��Ӧ�ij���,�����һ��'\0'������;
	/*  ע�⣺;
	/************************************************************************/
	static int CalcBase64Len(IN const size_t& len) {
		return (len / 3 + (len % 3 ? 1 : 0)) * 4 + 1; // one more byte for '\0'
	}

	static void binToBase64(IN const unsigned char *pbinary, IN size_t nbinaryLen, OUT char *pOutBase64);

	/************************************************************************/
	/*  ������[5/24/2016 IT];
	/*  ��������ȡָ��Base64�ַ������ȶ�Ӧ���ֽڳ���;
	/*  ������;
	/*  	[IN] len��Ҫ�����Base64�ַ�����;
	/*  ���أ�����ָ������len��Base64�ַ���ת��Ϊ�ֽڶ�Ӧ�ij���;
	/*  ע�⣺;
	/************************************************************************/
	static int CalcBinLen(size_t len) {
		return len / 4 * 3; 
	}

	static int base64ToBin(IN const char *pBase64, OUT unsigned char *pbinary, IN size_t maxLen);

private:
	static char decode64(unsigned char ch) {
		return ch < 128 ? sm_base64val[ch] : BAD;
	}

private:
	enum {BAD = -1};
	// ������ASCII�ַ�;
	static const char sm_base64digits[65];
	// ������ASCII�ַ�;
	static const char sm_base64val[128];
};

#endif // __BASE64_CODE__