#include "Base64.h" using namespace Framework; static Framework::Text base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; Text Framework::base64Encode(const char* data, int length) { Text result; int i = 0; int j = 0; unsigned char char_array_3[3]; unsigned char char_array_4[4]; while (length--) { char_array_3[i++] = *(data++); if (i == 3) { char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = (unsigned char)(((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4)); char_array_4[2] = (unsigned char)(((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6)); char_array_4[3] = char_array_3[2] & 0x3f; for (i = 0; (i < 4); i++) result.append((char)base64_chars[char_array_4[i]]); i = 0; } } if (i) { for (j = i; j < 3; j++) char_array_3[j] = '\0'; char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = (unsigned char)(((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4)); char_array_4[2] = (unsigned char)(((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6)); char_array_4[3] = char_array_3[2] & 0x3f; for (j = 0; (j < i + 1); j++) result.append((char)base64_chars[char_array_4[j]]); while ((i++ < 3)) result.append('='); } return result; } bool Framework::base64Decode(Text base64, char** data, int* length) { int i = 0; int j = 0; int k = 0; int l = 0; int n = 0; unsigned char char_array_4[4]; unsigned char char_array_3[3]; *length = 0; while (base64[l]) { if (base64[l] == '=') break; if (!base64_chars.hat(base64[l])) return false; l++; } *length = (l * 3) / 4; *data = new char[*length + 1]; while (base64[k]) { char_array_4[i++] = base64[k]; if (i == 4) { for (i = 0; i < 4; i++) char_array_4[i] = (unsigned char)(base64_chars.positionVon( char_array_4[i])); char_array_3[0] = (unsigned char)((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4)); char_array_3[1] = (unsigned char)(((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2)); char_array_3[2] = (unsigned char)(((char_array_4[2] & 0x3) << 6) + char_array_4[3]); for (i = 0; (i < 3) && n < *length; i++) (*data)[n++] = char_array_3[i]; i = 0; } k++; } if (i) { for (j = i; j < 4; j++) char_array_4[j] = 0; for (j = 0; j < 4; j++) char_array_4[j] = (unsigned char)(base64_chars.positionVon(char_array_4[j])); char_array_3[0] = (unsigned char)((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4)); char_array_3[1] = (unsigned char)(((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2)); char_array_3[2] = (unsigned char)(((char_array_4[2] & 0x3) << 6) + char_array_4[3]); for (j = 0; (j < i - 1) && n < *length; j++) (*data)[n++] = char_array_3[j]; } (*data)[*length] = '\0'; return true; }