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 <iostream>
#include <stdio.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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 <&