base64的C++实现

base64简介

base64网络上已经有很多人有讲述,下面摘录wiki上的简述:

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节可表示4个可打印字符。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。
在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
完整的base64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的4/3。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲器中剩下的bit用0补足。然后,每次取出6(因为26=64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。当原数据长度不是3的整数倍时, 如果最后剩下一个输入数据,在编码结果后加2个“=”;如果最后剩下两个输入数据,编码结果后加1个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证数据还原的正确性。

完整的base64说明可以参考wiki_base64
本文中主要陈述的是base64编码的一种C++代码实现。

base64_operation.h

先列出实现的API的声明头文件:

#ifndef _BASE64_OPERATION_H_
#define _BASE64_OPERATION_H_

#include 
#include 

typedef enum 
{
    E_BASH64_OK = 0,
    E_BASH64_ERROR_PARAM,
    E_BASH64_FILE_ERROR,
    E_BASH64_BUFFER_OVERFLOW,
    E_BASH64_ERROR_USUAL
}BASE64_RESULT;

class Base64_Operation
{
public:
    /**
     * [base64_GetInstance Get the object pointer]
     * @return  [the object pointer]
     */
    static Base64_Operation* base64_GetInstance(void);
    Base64_Operation();
    ~Base64_Operation();
    /**
     * [base64_file_encode Ecode a file to base64 format file]
     * @param  pInFile  [The input file pointer from fopen(), must be opened with "rb"]
     * @param  pOutFile [The output file pointer from fopen(), must be opened with "wb+"]
     * @return          [The error code]
     */
    BASE64_RESULT base64_file_encode(FILE*  pInFile, FILE* pOutFile);
    /**
     * [base64_file_decode decode a file from base64 format file]
     * @param  pInFile  [The input file pointer from fopen(), must be opened with "rb"]
     * @param  pOutFile [The output file pointer from fopen(), must be opened with "wb+"]
     * @return          [The error code]
     */
    BASE64_RESULT base64_file_decode(FILE* pInFile, FILE* pOutFile);
    /**
     * [base64_hex_encode Encode a buffer data to base64 format]
     * @param  pInBuffer      [The normal data buffer]
     * @param  InBufferLen    [The normal data length]
     * @param  pOutBuffer     [The output buffer]
     * @param  pOutBufferLen  [The output buffer of base64 length]
     * @return                [The error code]
     */
    BASE64_RESULT base64_hex_encode(char* pInBuffer, unsigned int InBufferLen, char *pOutBuffer,unsigned int *pOutBufferLen);
    /**
     * [base64_hex_decode decode a buffer data from base64 format]
     * @param  pInBuffer     [The base64 format buffer]
     * @param  InBufferLen   [The base64 buffer length]
     * @param  pOutBuffer    [The output buffer pointer]
     * @param  pOutBufferLen [The output buffer length]
     * @return               [The error code]
     */
    BASE64_RESULT base64_hex_decode(char* pInBuffer, unsigned int InBufferLen, char *pOutBuffer,unsigned int *pOutBufferLen); 
protected:
private:
    static Base64_Operation* Instance;
    static void _initDecTable(void);
    static unsigned int _singleGroupDecode(char* inBuffer, char* outBuffer);
    static void _singleGroupEncode(char* inBuffer, char* outBuffer);
};

#endif

主要有实现基于用户buffer的base64的编码与解码(支持小于unsigned int所能表示的最大长度);实现了文件的base64的编码与解码。另外base64完整规范有要求每隔76bytes需要有换行,本实现没有考虑这种要求,鄙人认为用户自己在编码的base64上按自己的需求去增加换行符应该会更好;

base64_operation.cpp

#include "base64_operation.h"
#include 
#include 
#include 

using std::cout;
using std::cin;
using std::endl;
using std::hex;


#define DECTABLE_LEN 123
#define EQUAL_SIGN_MAGIC 0xFF
#define FILE_BUFFER_LEN 0x200000
#define FILE_OUTTMP_LEN 0x300000

#define OPEN_DBG 0

Base64_Operation* Base64_Operation::Instance = NULL;

static const char base64Char[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static unsigned char charDecTable[DECTABLE_LEN+1];

void Base64_Operation::_initDecTable()
{
    int index = 0;

    memset(charDecTable, 0x0, DECTABLE_LEN);

    for(index = 'A'; index <= 

你可能感兴趣的:(C/C++,base64,c语言,编码,电子邮件)