Created
May 27, 2023 23:45
-
-
Save puppis42/210dc17bda3f6939acb23eaec97001e4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <string> | |
#include <vector> | |
#include <fstream> | |
using namespace std; | |
const char* base64_chars{ | |
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" | |
"abcdefghijklmnopqrstuvwxyz" | |
"0123456789+/" }; | |
string base64_encode(unsigned const char* input, unsigned const int len) { | |
string ret; | |
size_t i = 0; | |
unsigned char bytes[3]; | |
unsigned char sextets[4]; | |
while (i <= (len - 3)) { | |
bytes[0] = *(input++); | |
bytes[1] = *(input++); | |
bytes[2] = *(input++); | |
sextets[0] = (bytes[0] & 0xfc) >> 2; // Cuts last two bits off of first byte | |
sextets[1] = ((bytes[0] & 0x03) << 4) + ((bytes[1] & 0xf0) >> 4); // Takes last two bits from first byte and adds it to first 4 bits of 2nd byte | |
sextets[2] = ((bytes[1] & 0x0f) << 2) + ((bytes[2] & 0xc0) >> 6); // Takes last 4 bits of 2nd byte and adds it to first 2 bits of third byte | |
sextets[3] = bytes[2] & 0x3f; // takes last 6 bits of third byte | |
for (size_t j = 0; j < 4; ++j) { | |
ret += base64_chars[sextets[j]]; | |
} | |
i += 3; // increases to go to third byte | |
} | |
if (i != len) { | |
size_t k = 0; | |
size_t j = len - i; // Find index of last byte | |
while (k < j) { // Sets first bytes | |
bytes[k] = *(input++); | |
++k; | |
} | |
while (j < 3) { // Set last bytes to 0x00 | |
bytes[j] = '\0'; | |
++j; | |
} | |
sextets[0] = (bytes[0] & 0xfc) >> 2; // Cuts last two bits off of first byte | |
sextets[1] = ((bytes[0] & 0x03) << 4) + ((bytes[1] & 0xf0) >> 4); // Takes last two bits from first byte and adds it to first 4 bits of 2nd byte | |
sextets[2] = ((bytes[1] & 0x0f) << 2) + ((bytes[2] & 0xc0) >> 6); // Takes last 4 bits of 2nd byte and adds it to first 2 bits of third byte | |
// No last one is needed, because if there were 4, then (i == len) == true | |
for (j = 0; j < (len - i) + 1; ++j) { // Gets sextets that include data | |
ret += base64_chars[sextets[j]]; // Appends them to string | |
} | |
while ((j++) < 4) // Appends remaining ='s | |
ret += '='; | |
} | |
return ret; | |
} | |
string base64_encode_image(const string& path) { | |
vector<char> temp; | |
ifstream infile; | |
infile.open(path, ios::binary); // Open file in binary mode | |
if (infile.is_open()) { | |
while (!infile.eof()) { | |
char c = (char)infile.get(); | |
temp.push_back(c); | |
} | |
infile.close(); | |
} | |
else return "File could not be opened"; | |
string ret(temp.begin(), temp.end() - 1); | |
ret = base64_encode((unsigned const char*)ret.c_str(), ret.size()); | |
return ret; | |
} | |
int main() | |
{ | |
string s = base64_encode_image("tst.png"); | |
std::cout << "Status: " << s << endl; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment