From 538236772ce6edde390079c32533c1e70cf8bdca Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Fri, 6 Oct 2017 14:26:44 +0200 Subject: Implement BASE64 decoding of locations given by dictionary index --- src/util/base64.cc | 29 +++++++++++++++++++++++++++++ src/util/base64.h | 10 ++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/util/base64.cc create mode 100644 src/util/base64.h (limited to 'src') 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 +#include + +namespace dictzip { + +std::size_t base64_decode(const std::string& encoded) { + std::vector 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; +} + +} diff --git a/src/util/base64.h b/src/util/base64.h new file mode 100644 index 0000000..448609d --- /dev/null +++ b/src/util/base64.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +namespace dictzip { + +std::size_t base64_decode(const std::string& encoded); + +} -- cgit v1.2.3