Created
March 29, 2021 02:25
-
-
Save hsnks100/e146b5a9d78f92679b1348768976651c to your computer and use it in GitHub Desktop.
base64 with binary
This file contains 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 "base64.h" | |
#include <iostream> | |
static const std::string base64_chars = | |
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" | |
"abcdefghijklmnopqrstuvwxyz" | |
"0123456789+/"; | |
static inline bool is_base64(BYTE c) { | |
return (isalnum(c) || (c == '+') || (c == '/')); | |
} | |
std::string base64_encode(BYTE const* buf, unsigned int bufLen) { | |
std::string ret; | |
int i = 0; | |
int j = 0; | |
BYTE char_array_3[3]; | |
BYTE char_array_4[4]; | |
while (bufLen--) { | |
char_array_3[i++] = *(buf++); | |
if (i == 3) { | |
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; | |
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); | |
char_array_4[2] = ((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++) | |
ret += 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] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); | |
char_array_4[2] = ((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++) | |
ret += base64_chars[char_array_4[j]]; | |
while((i++ < 3)) | |
ret += '='; | |
} | |
return ret; | |
} | |
std::vector<BYTE> base64_decode(std::string const& encoded_string) { | |
int in_len = encoded_string.size(); | |
int i = 0; | |
int j = 0; | |
int in_ = 0; | |
BYTE char_array_4[4], char_array_3[3]; | |
std::vector<BYTE> ret; | |
while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { | |
char_array_4[i++] = encoded_string[in_]; in_++; | |
if (i ==4) { | |
for (i = 0; i <4; i++) | |
char_array_4[i] = base64_chars.find(char_array_4[i]); | |
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); | |
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); | |
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; | |
for (i = 0; (i < 3); i++) | |
ret.push_back(char_array_3[i]); | |
i = 0; | |
} | |
} | |
if (i) { | |
for (j = i; j <4; j++) | |
char_array_4[j] = 0; | |
for (j = 0; j <4; j++) | |
char_array_4[j] = base64_chars.find(char_array_4[j]); | |
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); | |
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); | |
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; | |
for (j = 0; (j < i - 1); j++) ret.push_back(char_array_3[j]); | |
} | |
return ret; | |
} |
This file contains 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
#ifndef _BASE64_H_ | |
#define _BASE64_H_ | |
#include <vector> | |
#include <string> | |
typedef unsigned char BYTE; | |
std::string base64_encode(BYTE const* buf, unsigned int bufLen); | |
std::vector<BYTE> base64_decode(std::string const&); | |
#endif |
This file contains 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
std::vector<BYTE> myData; | |
... | |
std::string encodedData = base64_encode(&myData[0], myData.size()); | |
std::vector<BYTE> decodedData = base64_decode(encodedData); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment