#include "base64.h" static char encodingTable[64] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+','/' }; int GetEncodeSize(const char *src) { return (strlen(src) + 2) / 3 * 4 + 1; } int GetDecodeSize(const char *src) { return strlen(src) / 4 * 3 + 1; } void Base64Encode(const char *src, char *dest) { int i = 0, j = 0, k = 0; int len = strlen(src); int m = len / 3; int n = len % 3; for(; i < m; i++) { k = i * 3; dest[j++] = encodingTable[(src[k] & 0xfc) >> 2]; dest[j++] = encodingTable[((src[k] & 0x03) << 4) | ((src[k+1] & 0xf0) >> 4)]; dest[j++] = encodingTable[((src[k+1] & 0x0f) << 2) | ((src[k+2] & 0xc0) >> 6)]; dest[j++] = encodingTable[src[k+2] & 0x3f]; } k = i * 3; if(n == 1) { dest[j++] = encodingTable[(src[k] & 0xfc) >> 2]; dest[j++] = encodingTable[(src[k] & 0x03) << 4]; dest[j++] = '='; dest[j++] = '='; } else if(n == 2) { dest[j++] = encodingTable[(src[k] & 0xfc) >> 2]; dest[j++] = encodingTable[((src[k] & 0x03) << 4) | ((src[k+1] & 0xf0) >> 4)]; dest[j++] = encodingTable[(src[k+1] & 0x0f) << 2]; dest[j++] = '='; } dest[j] = '/0'; } void Base64Decode(const char *src, char *dest) { int i = 0, j = 0, k = 0; int size = strlen(src); int len = 0, m = 0, n = 0; char *ch = (char *)malloc(size + 1); memset(ch, 0, size + 1); for(; i < size; i++) { if(src[i] >= 'A' && src[i] <= 'Z') ch[i] = src[i] - 'A'; else if(src[i] >= 'a' && src[i] <= 'z') ch[i] = src[i] - 'a' + 26; else if(src[i] >= '0' && src[i] <= '9') ch[i] = src[i] - '0' + 52; else if(src[i] == '+') ch[i] = 62; else if(src[i] == '/') ch[i] = 63; } len = strlen(ch); m = len / 4; n = len % 4; for(i = 0; i < m; i++) { k = i * 4; dest[j++] = (ch[k] << 2) | ((ch[k+1] & 0x30) >> 4); dest[j++] = ((ch[k+1] & 0x0f) << 4) | ((ch[k+2] & 0x3c) >> 2); dest[j++] = ((ch[k+2] & 0x03) << 6) | ch[k+3]; } k = i * 4; if(n == 1) { dest[j++] = ch[k] << 2; } else if(n == 2) { dest[j++] = (ch[k] << 2) | ((ch[k+1] & 0x30) >> 4); dest[j++] = (ch[k+1] & 0x0f) << 4; } else if(n == 3) { dest[j++] = (ch[k] << 2) | ((ch[k+1] & 0x30) >> 4); dest[j++] = ((ch[k+1] & 0x0f) << 4) | ((ch[k+2] & 0x3c) >> 2); dest[j++] = (ch[k+2] & 0x03) << 6; } dest[j] = '/0'; free(ch); }