From fe7936d4bbb1d2db0e97711c0d8626ecd65fee78 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Tue, 23 Aug 2022 15:24:44 +0200 Subject: [PATCH] Add base64_decode --- src/strutils.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ src/strutils.h | 2 ++ 2 files changed, 54 insertions(+) diff --git a/src/strutils.cpp b/src/strutils.cpp index a088d4f..f42cc0c 100644 --- a/src/strutils.cpp +++ b/src/strutils.cpp @@ -107,6 +107,58 @@ std::string toBase64String(std::basic_string_view buf) return out; } +namespace { +constexpr std::string_view base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; +bool is_base64(char c) { + return (isalnum(c) || (c == '+') || (c == '/')); +} +} + +std::string base64_decode(std::string const& encoded_string) +{ + int in_len = encoded_string.size(); + int i = 0; + int j = 0; + int in_ = 0; + 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.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; + } + bool stringEqualsIgnoreCase(std::string_view a, std::string_view b) { if (a.size() != b.size()) diff --git a/src/strutils.h b/src/strutils.h index 1fc4638..ed867aa 100644 --- a/src/strutils.h +++ b/src/strutils.h @@ -50,6 +50,8 @@ inline std::string toBase64String(std::string_view str) return toBase64String(std::basic_string_view{reinterpret_cast(str.data()), str.size()}); } +std::string base64_decode(std::string const& encoded_string); + bool stringEqualsIgnoreCase(std::string_view a, std::string_view b); bool stringStartsWith(std::string_view fullString, std::string_view begin); bool stringEndsWith(std::string_view fullString, std::string_view ending);