//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; }