BASE64编码与解码(Base64Encode,Base64Decode)


//  在VC6.0下建一个控制台程序

    #include  " stdafx.h "
#include 
< string >

using namespace std;

#ifdef _WIN32
#pragma warning(disable:
4514 )
#endif

class Base64
{
public:
    static inline bool is_base64(unsigned 
char  c) {
        
return  (isalnum(c)  ||  (c  ==  ' + ')  ||  (c  ==  ' / '));};
    static std::string base64_encode(unsigned 
char  const *  , unsigned  int  len);
    static std::string base64_decode(std::string const
&  s);
};

static const std::string base64_chars 
=  
" ABCDEFGHIJKLMNOPQRSTUVWXYZ "
" abcdefghijklmnopqrstuvwxyz "
" 0123456789+/ " ;

std::string Base64::base64_encode(unsigned 
char  const *  bytes_to_encode, unsigned  int  in_len) {
    std::string ret;
    
int  i  =   0 ;
    
int  j  =   0 ;
    unsigned 
char  char_array_3[ 3 ];
    unsigned 
char  char_array_4[ 4 ];
    
    
while  (in_len -- ) {
        char_array_3[i
++ =   * (bytes_to_encode ++ );
        
if  (i  ==   3 ) {
            char_array_4[
0 =  (char_array_3[ 0 &   0xfc >>   2 ;
            char_array_4[
1 =  ((char_array_3[ 0 &   0x03 <<   4 +  ((char_array_3[ 1 &   0xf0 >>   4 );
            char_array_4[
2 =  ((char_array_3[ 1 &   0x0f <<   2 +  ((char_array_3[ 2 &   0xc0 >>   6 );
            char_array_4[
3 =  char_array_3[ 2 &   0x3f ;
            
            
for (i  =   0 ; (i  < 4 ) ; i ++ )
                ret 
+=  base64_chars[char_array_4[i]];
            i 
=   0 ;
        }
    }
    
    
if  (i)
    {
        
for (j  =  i; j  <   3 ; j ++ )
            char_array_3[j] 
=  ' 0 ';
        
        char_array_4[
0 =  (char_array_3[ 0 &   0xfc >>   2 ;
        char_array_4[
1 =  ((char_array_3[ 0 &   0x03 <<   4 +  ((char_array_3[ 1 &   0xf0 >>   4 );
        char_array_4[
2 =  ((char_array_3[ 1 &   0x0f <<   2 +  ((char_array_3[ 2 &   0xc0 >>   6 );
        char_array_4[
3 =  char_array_3[ 2 &   0x3f ;
        
        
for  (j  =   0 ; (j  <  i  +   1 ); j ++ )
            ret 
+=  base64_chars[char_array_4[j]];
        
        
while ((i ++   <   3 ))
            ret 
+=  ' = ';
        
    }
    
    
return  ret;
}

std::string Base64::base64_decode(std::string const
&  encoded_string) {
    
int  in_len  =  encoded_string.size();
    
int  i  =   0 ;
    
int  j  =   0 ;
    
int  in_  =   0 ;
    unsigned 
char  char_array_4[ 4 ], char_array_3[ 3 ];
    std::string ret;
    
    
while  (in_len --   &&  ( encoded_string[in_]  !=  ' = ')  &&  is_base64(encoded_string[in_])) {
        char_array_4[i
++ =  encoded_string[in_]; in_ ++ ;
        
if  (i  == 4 ) {
            
for  (i  =   0 ; i  < 4 ; i ++ )
                char_array_4[i] 
=  base64_chars.find(char_array_4[i]);
            
            char_array_3[
0 =  (char_array_4[ 0 <<   2 +  ((char_array_4[ 1 &   0x30 >>   4 );
            char_array_3[
1 =  ((char_array_4[ 1 &   0xf <<   4 +  ((char_array_4[ 2 &   0x3c >>   2 );
            char_array_3[
2 =  ((char_array_4[ 2 &   0x3 <<   6 +  char_array_4[ 3 ];
            
            
for  (i  =   0 ; (i  <   3 ); i ++ )
                ret 
+=  char_array_3[i];
            i 
=   0 ;
        }
    }
    
    
if  (i) {
        
for  (j  =  i; j  < 4 ; j ++ )
            char_array_4[j] 
=   0 ;
        
        
for  (j  =   0 ; j  < 4 ; j ++ )
            char_array_4[j] 
=  base64_chars.find(char_array_4[j]);
        
        char_array_3[
0 =  (char_array_4[ 0 <<   2 +  ((char_array_4[ 1 &   0x30 >>   4 );
        char_array_3[
1 =  ((char_array_4[ 1 &   0xf <<   4 +  ((char_array_4[ 2 &   0x3c >>   2 );
        char_array_3[
2 =  ((char_array_4[ 2 &   0x3 <<   6 +  char_array_4[ 3 ];
        
        
for  (j  =   0 ; (j  <  i  -   1 ); j ++ ) ret  +=  char_array_3[j];
    }
    
    
return  ret;
}

int  main( int  argc,  char *  argv[])
{
    string str 
=   " http://blog.csdn.net " ;
    
    string str1 
=  Base64::base64_encode((const unsigned  char   * )str.c_str(), str.length());   //  对BASE64编码
    string str2  =  Base64::base64_decode(str1);  //  对BASE64解码

    printf(
" %s  " , str1.c_str());
    printf(
" %s  " , str2.c_str());    

    
return   0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值