admin
2025-04-08 5c9991be21f57781573f04961ec511ac2938ea3d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*base64.c*/
#include "base64.h"  
 
 char* base64_encode(const  char* str)
{
    long len;
    long str_len;
     char* res;
    int i, j;
    //¶¨Òåbase64±àÂë±í  
    const char* base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
    //¼ÆËã¾­¹ýbase64±àÂëºóµÄ×Ö·û´®³¤¶È  
    str_len = strlen(str);
    if (str_len % 3 == 0)
        len = str_len / 3 * 4;
    else
        len = (str_len / 3 + 1) * 4;
 
    res =( char*) malloc(sizeof( char) * len + 1);
    res[len] = '\0';
 
    //ÒÔ3¸ö8λ×Ö·ûΪһ×é½øÐбàÂë  
    for (i = 0, j = 0; i < len - 2; j += 3, i += 4)
    {
        res[i] = base64_table[str[j] >> 2]; //È¡³öµÚÒ»¸ö×Ö·ûµÄǰ6λ²¢ÕÒ³ö¶ÔÓ¦µÄ½á¹û×Ö·û  
        res[i + 1] = base64_table[(str[j] & 0x3) << 4 | (str[j + 1] >> 4)]; //½«µÚÒ»¸ö×Ö·ûµÄºóλÓëµÚ¶þ¸ö×Ö·ûµÄǰ4λ½øÐÐ×éºÏ²¢ÕÒµ½¶ÔÓ¦µÄ½á¹û×Ö·û  
        res[i + 2] = base64_table[(str[j + 1] & 0xf) << 2 | (str[j + 2] >> 6)]; //½«µÚ¶þ¸ö×Ö·ûµÄºó4λÓëµÚÈý¸ö×Ö·ûµÄǰ2λ×éºÏ²¢ÕÒ³ö¶ÔÓ¦µÄ½á¹û×Ö·û  
        res[i + 3] = base64_table[str[j + 2] & 0x3f]; //È¡³öµÚÈý¸ö×Ö·ûµÄºó6λ²¢ÕÒ³ö½á¹û×Ö·û  
    }
 
    switch (str_len % 3)
    {
    case 1:
        res[i - 2] = '=';
        res[i - 1] = '=';
        break;
    case 2:
        res[i - 1] = '=';
        break;
    }
 
    return res;
}
 
 char* base64_decode(const char* code)
{
    //¸ù¾Ýbase64±í£¬ÒÔ×Ö·ûÕÒµ½¶ÔÓ¦µÄÊ®½øÖÆÊý¾Ý  
    int table[] = { 0,0,0,0,0,0,0,0,0,0,0,0,
             0,0,0,0,0,0,0,0,0,0,0,0,
             0,0,0,0,0,0,0,0,0,0,0,0,
             0,0,0,0,0,0,0,62,0,0,0,
             63,52,53,54,55,56,57,58,
             59,60,61,0,0,0,0,0,0,0,0,
             1,2,3,4,5,6,7,8,9,10,11,12,
             13,14,15,16,17,18,19,20,21,
             22,23,24,25,0,0,0,0,0,0,26,
             27,28,29,30,31,32,33,34,35,
             36,37,38,39,40,41,42,43,44,
             45,46,47,48,49,50,51
    };
    long len;
    long str_len;
     char* res;
    int i, j;
 
    //¼ÆËã½âÂëºóµÄ×Ö·û´®³¤¶È  
    len = strlen(code);
    //ÅжϱàÂëºóµÄ×Ö·û´®ºóÊÇ·ñÓÐ=  
    if (strstr(code, "=="))
        str_len = len / 4 * 3 - 2;
    else if (strstr(code, "="))
        str_len = len / 4 * 3 - 1;
    else
        str_len = len / 4 * 3;
 
    res = ( char*)malloc(sizeof( char) * str_len + 1);
    res[str_len] = '\0';
 
    //ÒÔ4¸ö×Ö·ûΪһλ½øÐнâÂë  
    for (i = 0, j = 0; i < len - 2; j += 3, i += 4)
    {
        res[j] = ((unsigned char)table[code[i]]) << 2 | (((unsigned char)table[code[i + 1]]) >> 4); //È¡³öµÚÒ»¸ö×Ö·û¶ÔÓ¦base64±íµÄÊ®½øÖÆÊýµÄǰ6λÓëµÚ¶þ¸ö×Ö·û¶ÔÓ¦base64±íµÄÊ®½øÖÆÊýµÄºó2λ½øÐÐ×éºÏ  
        res[j + 1] = (((unsigned char)table[code[i + 1]]) << 4) | (((unsigned char)table[code[i + 2]]) >> 2); //È¡³öµÚ¶þ¸ö×Ö·û¶ÔÓ¦base64±íµÄÊ®½øÖÆÊýµÄºó4λÓëµÚÈý¸ö×Ö·û¶ÔÓ¦bas464±íµÄÊ®½øÖÆÊýµÄºó4λ½øÐÐ×éºÏ  
        res[j + 2] = (((unsigned char)table[code[i + 2]]) << 6) | ((unsigned char)table[code[i + 3]]); //È¡³öµÚÈý¸ö×Ö·û¶ÔÓ¦base64±íµÄÊ®½øÖÆÊýµÄºó2λÓëµÚ4¸ö×Ö·û½øÐÐ×éºÏ  
    }
 
    return res;
 
}