diff options
Diffstat (limited to 'src/util/base64.cc')
-rw-r--r-- | src/util/base64.cc | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/util/base64.cc b/src/util/base64.cc new file mode 100644 index 0000000..4e8d0a4 --- /dev/null +++ b/src/util/base64.cc @@ -0,0 +1,29 @@ +#include "base64.h" + +#include <vector> +#include <stdexcept> + +namespace dictzip { + +std::size_t base64_decode(const std::string& encoded) { + std::vector<std::int8_t> map(256,-1); + + for ( int i = 0; i < 64; ++i ) { + map["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]] = i; + } + + std::size_t value = 0; + + for ( std::uint8_t c : encoded ) { + if ( map[c] == -1 ) { + throw std::invalid_argument("Invalid character in BASE64 string."); + } else { + value *= 64; + value += map[c]; + } + } + + return value; +} + +} |