Last active
March 8, 2017 07:20
-
-
Save xylcbd/b887b8dac505cced7a194953ec5f5576 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
static const std::string base64_chars = | |
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" | |
"abcdefghijklmnopqrstuvwxyz" | |
"0123456789+/"; | |
static inline bool is_base64(unsigned char c) { | |
return (isalnum(c) || (c == '+') || (c == '/')); | |
} | |
std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { | |
std::string ret; | |
int i = 0; | |
int j = 0; | |
unsigned char char_array_3[3]; | |
unsigned char char_array_4[4]; | |
while (in_len--) { | |
char_array_3[i++] = *(bytes_to_encode++); | |
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::string base64_decode(std::string const& encoded_string) { | |
int in_len = encoded_string.size(); | |
int i = 0; | |
int j = 0; | |
int in_ = 0; | |
unsigned char char_array_4[4], char_array_3[3]; | |
std::string 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 += 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 += char_array_3[j]; | |
} | |
return ret; | |
} | |
std::string charToHex(unsigned char c) { | |
short i = c; | |
std::stringstream s; | |
s << "%" << std::setw(2) << std::setfill('0') << std::hex << i; | |
return s.str(); | |
} | |
unsigned char hexToChar(const std::string &str) { | |
short c = 0; | |
if(!str.empty()) { | |
std::istringstream in(str); | |
in >> std::hex >> c; | |
if(in.fail()) { | |
throw std::runtime_error("stream decode failure"); | |
} | |
} | |
return static_cast<unsigned char>(c); | |
} | |
std::string urlEncode(const std::string &toEncode) { | |
std::ostringstream out; | |
for(std::string::size_type i=0; i < toEncode.length(); ++i) { | |
short t = toEncode.at(i); | |
if( | |
t == 45 || // hyphen | |
(t >= 48 && t <= 57) || // 0-9 | |
(t >= 65 && t <= 90) || // A-Z | |
t == 95 || // underscore | |
(t >= 97 && t <= 122) || // a-z | |
t == 126 // tilde | |
) { | |
out << toEncode.at(i); | |
} else { | |
out << charToHex(toEncode.at(i)); | |
} | |
} | |
return out.str(); | |
} | |
std::string urlDecode(const std::string &toDecode) { | |
std::ostringstream out; | |
for(std::string::size_type i=0; i < toDecode.length(); ++i) { | |
if(toDecode.at(i) == '%') { | |
std::string str(toDecode.substr(i+1, 2)); | |
out << hexToChar(str); | |
i += 2; | |
} else { | |
out << toDecode.at(i); | |
} | |
} | |
return out.str(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment