Base64 Encode and Decode - BCB[转]

ContractedBlock.gif ExpandedBlockStart.gif Code
  1      // Base 64 encoder / decoder
  2
  3
  4      //---------------------------------------------------------------------------
  5
  6       
  7
  8 AnsiString __fastcall TForm1::Base64Encode(AnsiString slToEnc)
  9
 10ExpandedBlockStart.gifContractedBlock.gif      {
 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=0int 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
 42ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 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
 54ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 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
 92ExpandedSubBlockStart.gifContractedSubBlock.gif        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
109ExpandedBlockStart.gifContractedBlock.gif      {
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
141ExpandedSubBlockStart.gifContractedSubBlock.gif        {
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
153ExpandedSubBlockStart.gifContractedSubBlock.gif        {
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
165ExpandedSubBlockStart.gifContractedSubBlock.gif        {
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
205ExpandedSubBlockStart.gifContractedSubBlock.gif        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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值