
Code
1
// Base 64 encoder / decoder
2
3
4
//---------------------------------------------------------------------------
5
6
7
8
AnsiString __fastcall TForm1::Base64Encode(AnsiString slToEnc)
9
10
{
11
12
//The Base64 Table
13
14
const char Base64Table[64]=
15
16
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
17
18
char * buftoenc = slToEnc.c_str();
19
20
int bufsize = slToEnc.Length() + 1;
21
22
char * encbuf = new char[slToEnc.Length() * 5];
23
24
encbuf[0] = '\0'; int ilStrLen = -1;
25
26
int i=0; int b64byte[5];
27
28
unsigned char *buftemp;
29
30
AnsiString slRetVal = EmptyStr;
31
32
33
34
35
36
buftemp=(unsigned char *)malloc(bufsize+2);
37
38
strcpy(buftemp,buftoenc);
39
40
if (fmod(bufsize,3)==1)
41
42
{
43
44
buftemp[bufsize]='\0';
45
46
buftemp[bufsize+1]='\0';
47
48
}
49
50
if (fmod(bufsize,3)==2)buftemp[bufsize]='\0';
51
52
while (i<bufsize)
53
54
{
55
56
b64byte[0]=buftemp[i]>>2;
57
58
b64byte[1]=((buftemp[i]&3)<<4)|(buftemp[i+1]>>4);
59
60
b64byte[2]=((buftemp[i+1]&0x0F)<<2)|(buftemp[i+2]>>6);
61
62
b64byte[3]=buftemp[i+2]&0x3F;
63
64
encbuf[i+(i/3)]=Base64Table[b64byte[0]];
65
66
encbuf[i+(i/3)+1]=Base64Table[b64byte[1]];
67
68
encbuf[i+(i/3)+2]=Base64Table[b64byte[2]];
69
70
encbuf[i+(i/3)+3]=Base64Table[b64byte[3]];
71
72
i+=3;
73
74
}
75
76
free(buftemp);
77
78
79
80
81
82
if (fmod(bufsize,3)==0) ilStrLen = bufsize*8/6;
83
84
else if (fmod(bufsize,3)==1) ilStrLen = ((bufsize+2)*8/6)-2;
85
86
else if (fmod(bufsize,3)==2) ilStrLen = ((bufsize+1)*8/6)-1;
87
88
else ilStrLen = -1;
89
90
if(ilStrLen> 0) slRetVal = AnsiString(encbuf).SubString(1, ilStrLen);
91
92
if(encbuf != NULL)
{ delete encbuf; encbuf = NULL; }
93
94
95
96
return slRetVal;
97
98
}
99
100
101
102
103
104
//-----------------------------------------------------------------------
105
106
107
AnsiString __fastcall TForm1::Base64Decode(AnsiString slToDec)
108
109
{
110
111
//Base64 Table
112
113
const char Base64Table[64]=
114
115
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
116
117
char * buftodec = slToDec.c_str();
118
119
int bufsize = slToDec.Length() + 1;
120
121
char * decbuf = new char[slToDec.Length() * 5];
122
123
decbuf[0] = '\0'; int ilStrLen = -1;
124
125
AnsiString slRetVal = EmptyStr;
126
127
128
129
int i=0; unsigned char binbyte[4];
130
131
int cpos[5]; unsigned char *buftemp;
132
133
134
135
buftemp=(unsigned char *)malloc(bufsize);
136
137
strcpy(buftemp,buftodec);
138
139
if (fmod(bufsize,4)==1)
140
141
{
142
143
buftemp[bufsize]='\0';
144
145
buftemp[bufsize+1]='\0';
146
147
buftemp[bufsize+2]='\0';
148
149
}
150
151
if (fmod(bufsize,4)==2)
152
153
{
154
155
buftemp[bufsize]='\0';
156
157
buftemp[bufsize+1]='\0';
158
159
}
160
161
if (fmod(bufsize,4)==3)buftemp[bufsize]='\0';
162
163
while (i<bufsize)
164
165
{
166
167
cpos[0]=strchr(Base64Table,buftemp[i])-Base64Table;
168
169
cpos[1]=strchr(Base64Table,buftemp[i+1])-Base64Table;
170
171
cpos[2]=strchr(Base64Table,buftemp[i+2])-Base64Table;
172
173
cpos[3]=strchr(Base64Table,buftemp[i+3])-Base64Table;
174
175
binbyte[0]=((cpos[0]<<2)|(cpos[1]>>4));
176
177
binbyte[1]=((cpos[1]<<4)|(cpos[2]>>2));
178
179
binbyte[2]=(((cpos[2]&0x03)<<6)|(cpos[3]&0x3f));
180
181
decbuf[i-(i/4)]=binbyte[0];
182
183
decbuf[i-(i/4)+1]=binbyte[1];
184
185
decbuf[i-(i/4)+2]=binbyte[2];
186
187
i+=4;
188
189
}
190
191
free(buftemp);
192
193
if (fmod(bufsize,4)==0) ilStrLen = bufsize*6/8;
194
195
else if (fmod(bufsize,4)==1) ilStrLen = ((bufsize+3)*6/8)-3;
196
197
else if (fmod(bufsize,4)==2) ilStrLen = ((bufsize+2)*6/8)-2;
198
199
else if (fmod(bufsize,4)==3) ilStrLen = ((bufsize+1)*6/8)-1;
200
201
else ilStrLen = -1;
202
203
if(ilStrLen> 0) slRetVal = AnsiString(decbuf).SubString(1, ilStrLen);
204
205
if(decbuf != NULL)
{ delete decbuf; decbuf = NULL; }
206
207
return slRetVal;
208
209
}
210
转载于:https://www.cnblogs.com/tecsun/archive/2008/12/11/1352500.html