BASE64编码与解码(Base64Encode,Base64Decode)

来源:互联网 发布:天人网络电视在线 编辑:程序博客网 时间:2024/06/05 14:29

//  在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;
}
原创粉丝点击