现在的位置: 首页 > 综合 > 正文

base64编解码

2013年08月22日 ⁄ 综合 ⁄ 共 1710字 ⁄ 字号 评论关闭
//Base64
static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const char cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq";

/*
** encodeblock
**
** encode 3 8-bit binary bytes as 4 '6-bit' characters
*/
static void encodeblock( unsigned char in[3], unsigned char out[4], int len )
{
	out[0] = cb64[ in[0] >> 2 ];
	//原来的代码 out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ];
    out[1] = cb64[ ((in[0] & 0x03) << 4) | (   (len == 1)?0:(in[1] & 0xf0) >> 4) ];
	out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '=');
	out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '=');
}

/*
** decodeblock
**
** decode 4 '6-bit' characters into 3 8-bit binary bytes
*/
static void decodeblock( unsigned char in[4], unsigned char out[3] )
{   
	out[ 0 ] = (unsigned char ) (in[0] << 2 | in[1] >> 4);
	out[ 1 ] = (unsigned char ) (in[1] << 4 | in[2] >> 2);
	out[ 2 ] = (unsigned char ) (((in[2] << 6) & 0xc0) | in[3]);
}

/*!
@brief base64 解码
@param pIn Base64 字符串
@param len pIn的长度
@param out [OUT] 解码后的原始数据输出
*/
void base64_decode(const unsigned char* pIn, int len, string& out)
{
	int m = len / 4;
	int i, j;
	unsigned char in[4];
	unsigned char v;
	vector<char> outBuf(4*m);
	unsigned char* pOut = (unsigned char*)&outBuf[0];
	for(i=0; i<m; ++i) {
		for (j=0; j<4; ++j) {
			v = pIn[i*4+j];
			v = (unsigned char) ((v < 43 || v > 122) ? 0 : cd64[ v - 43 ]);
			if( v ) {
				v = (unsigned char) ((v == '$') ? 0 : v - 61);
			}
			if( v ) {
				in[ j ] = (unsigned char) (v - 1);
			}
		}
		decodeblock(in, pOut+3*i);
	}
	out.clear();
	out.append((char*)pOut, 3*m);
}

/*!
@brief base64 编码
@param pIn 原始数据指针
@param len 原始数据大小
@param out [OUT] 编码后的Base64字符串
*/
void base64_encode(unsigned char* pIn, int len, string& out)
{
	int m = len / 3;
	int i;

	vector<char> outBuf(4*(m+1) + 1);
	unsigned char* pOut = (unsigned char*)&outBuf[0];

	for(i=0; i<m; ++i) {
		encodeblock(pIn+3*i, pOut+4*i, 3);
	}
	*(pOut+4*i) = 0;
	m = len % 3;
	if (m != 0) {
		encodeblock(pIn+3*i, pOut+4*i, m);
		*(pOut+4*(i+1)) = 0;
	}
	out = (char*)pOut;
}

抱歉!评论已关闭.