#ifndef BASE64_CONVERTER #define BASE64_CONVERTER #include #include #include using std::string; using std::vector; typedef unsigned char UC; typedef unsigned int UI; #define EXTRA '^' #define MASK1 0xfc #define MASK2 0x03 #define MASK3 0xf0 #define MASK4 0x0f #define MASK5 0xc0 #define MASK6 0x3f #define MASK7 0x30 #define MASK8 0x3c const string characterMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; inline string Base64Encode(UC const* buffer, size_t& size) { string encoded = ""; UI i = 0, j = 0, k = 0; UC temp_a_3[3], temp_4[4]; for (i = 0; i < size; i += 3) { for (j = i, k = 0; j < size && j < i + 3; j++) temp_a_3[k++] = *(buffer++); for (; k < 3; k++) temp_a_3[k] = '\0'; temp_4[0] = (temp_a_3[0] & MASK1) >> 2; temp_4[1] = ((temp_a_3[0] & MASK2) << 4) + ((temp_a_3[1] & MASK3) >> 4); temp_4[2] = ((temp_a_3[1] & MASK4) << 2) + ((temp_a_3[2] & MASK5) >> 6); temp_4[3] = temp_a_3[2] & MASK6; for (j = i, k = 0; j < size + 1 && j < i + 4; j++, k++) encoded += characterMap[temp_4[k]]; for (; k < 4; k++) encoded += EXTRA; } return encoded; } inline vector Base64Decoder(string const& encoded) { UI i = 0, j = 0, k = 0, in_len = encoded.size(); UC temp_a_3[3], temp_4[4]; vector decoded; for (i = 0; i < in_len; i += 4) { for (j = i, k = 0; j < i + 4 && encoded[j] != EXTRA; j++) temp_4[k++] = characterMap.find(encoded[j]); for (; k < 4; k++) temp_4[k++] = '\0'; temp_a_3[0] = (temp_4[0] << 2) + ((temp_4[1] & MASK7) >> 4); temp_a_3[1] = ((temp_4[1] & MASK4) << 4) + ((temp_4[2] & MASK8) >> 2); temp_a_3[2] = ((temp_4[2] & MASK2) << 6) + temp_4[3]; for (j = i, k = 0; k < 3 && encoded[j + 1] != EXTRA; j++, k++) decoded.push_back(temp_a_3[k]); } return decoded; } #endif