1
// Base 64 encoder / decoder2

3

4
//---------------------------------------------------------------------------5

6
7

8
AnsiString __fastcall TForm1::Base64Encode(AnsiString slToEnc)9

10

{11

12
//The Base64 Table13

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 Table112

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

浙公网安备 33010602011771号