| 230 | } |
| 231 | |
| 232 | string EncodeBase32(const unsigned char* pch, size_t len) |
| 233 | { |
| 234 | static const char *pbase32 = "abcdefghijklmnopqrstuvwxyz234567"; |
| 235 | |
| 236 | string strRet=""; |
| 237 | strRet.reserve((len+4)/5*8); |
| 238 | |
| 239 | int mode=0, left=0; |
| 240 | const unsigned char *pchEnd = pch+len; |
| 241 | |
| 242 | while (pch<pchEnd) |
| 243 | { |
| 244 | int enc = *(pch++); |
| 245 | switch (mode) |
| 246 | { |
| 247 | case 0: // we have no bits |
| 248 | strRet += pbase32[enc >> 3]; |
| 249 | left = (enc & 7) << 2; |
| 250 | mode = 1; |
| 251 | break; |
| 252 | |
| 253 | case 1: // we have three bits |
| 254 | strRet += pbase32[left | (enc >> 6)]; |
| 255 | strRet += pbase32[(enc >> 1) & 31]; |
| 256 | left = (enc & 1) << 4; |
| 257 | mode = 2; |
| 258 | break; |
| 259 | |
| 260 | case 2: // we have one bit |
| 261 | strRet += pbase32[left | (enc >> 4)]; |
| 262 | left = (enc & 15) << 1; |
| 263 | mode = 3; |
| 264 | break; |
| 265 | |
| 266 | case 3: // we have four bits |
| 267 | strRet += pbase32[left | (enc >> 7)]; |
| 268 | strRet += pbase32[(enc >> 2) & 31]; |
| 269 | left = (enc & 3) << 3; |
| 270 | mode = 4; |
| 271 | break; |
| 272 | |
| 273 | case 4: // we have two bits |
| 274 | strRet += pbase32[left | (enc >> 5)]; |
| 275 | strRet += pbase32[enc & 31]; |
| 276 | mode = 0; |
| 277 | } |
| 278 | } |
| 279 | |
| 280 | static const int nPadding[5] = {0, 6, 4, 3, 1}; |
| 281 | if (mode) |
| 282 | { |
| 283 | strRet += pbase32[left]; |
| 284 | for (int n=0; n<nPadding[mode]; n++) |
| 285 | strRet += '='; |
| 286 | } |
| 287 | |
| 288 | return strRet; |
| 289 | } |