123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- /*
- ******
- base64.hpp is a repackaging of the base64.cpp and base64.h files into a
- single header suitable for use as a header only library. This conversion was
- done by Peter Thorson (webmaster@zaphoyd.com) in 2012. All modifications to
- the code are redistributed under the same license as the original, which is
- listed below.
- ******
- base64.cpp and base64.h
- Copyright (C) 2004-2008 Ren Nyffenegger
- This source code is provided 'as-is', without any express or implied
- warranty. In no event will the author be held liable for any damages
- arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
- 1. The origin of this source code must not be misrepresented; you must not
- claim that you wrote the original source code. If you use this source code
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original source code.
- 3. This notice may not be removed or altered from any source distribution.
- Ren Nyffenegger rene.nyffenegger@adp-gmbh.ch
- */
- #ifndef __ASIO2_BASE64_IMPL_HPP__
- #define __ASIO2_BASE64_IMPL_HPP__
- #include <string>
- #include <string_view>
- namespace asio2 {
- namespace detail
- {
- static std::string_view const base64_chars =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz"
- "0123456789+/";
- }
- class base64
- {
- public:
- /// Test whether a character is a valid base64 character
- /**
- * @param c The character to test
- * @return true if c is a valid base64 character
- */
- inline bool is_base64(unsigned char c) noexcept {
- return (c == 43 || // +
- (c >= 47 && c <= 57) || // /-9
- (c >= 65 && c <= 90) || // A-Z
- (c >= 97 && c <= 122)); // a-z
- }
- /// Encode a char buffer into a base64 string
- /**
- * @param input The input data
- * @param len The length of input in bytes
- * @return A base64 encoded string representing input
- */
- inline std::string encode(unsigned char const * input, size_t len) {
- std::string ret;
- int i = 0;
- int j = 0;
- unsigned char char_array_3[3];
- unsigned char char_array_4[4];
- while (len--) {
- char_array_3[i++] = *(input++);
- if (i == 3) {
- char_array_4[0] = (unsigned char)((char_array_3[0] & 0xfc) >> 2);
- char_array_4[1] = (unsigned char)(((char_array_3[0] & 0x03) << 4) +
- ((char_array_3[1] & 0xf0) >> 4));
- char_array_4[2] = (unsigned char)(((char_array_3[1] & 0x0f) << 2) +
- ((char_array_3[2] & 0xc0) >> 6));
- char_array_4[3] = (unsigned char)(char_array_3[2] & 0x3f);
- for(i = 0; (i <4) ; i++) {
- ret += detail::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] = (unsigned char)((char_array_3[0] & 0xfc) >> 2);
- char_array_4[1] = (unsigned char)(((char_array_3[0] & 0x03) << 4) +
- ((char_array_3[1] & 0xf0) >> 4));
- char_array_4[2] = (unsigned char)(((char_array_3[1] & 0x0f) << 2) +
- ((char_array_3[2] & 0xc0) >> 6));
- char_array_4[3] = (unsigned char)(char_array_3[2] & 0x3f);
- for (j = 0; (j < i + 1); j++) {
- ret += detail::base64_chars[char_array_4[j]];
- }
- while((i++ < 3)) {
- ret += '=';
- }
- }
- return ret;
- }
- /// Encode a string into a base64 string
- /**
- * @param input The input data
- * @return A base64 encoded string representing input
- */
- inline std::string encode(std::string_view const & input) {
- return encode(
- reinterpret_cast<const unsigned char *>(input.data()),
- input.size()
- );
- }
- /// Decode a base64 encoded string into a string of raw bytes
- /**
- * @param input The base64 encoded input data
- * @return A string representing the decoded raw bytes
- */
- inline std::string decode(std::string_view const & input) {
- size_t in_len = input.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-- && ( input[in_] != '=') && is_base64(input[in_])) {
- char_array_4[i++] = input[in_]; in_++;
- if (i ==4) {
- for (i = 0; i <4; i++) {
- char_array_4[i] = static_cast<unsigned char>(detail::base64_chars.find(char_array_4[i]));
- }
- char_array_3[0] = (unsigned char)((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4));
- char_array_3[1] = (unsigned char)(((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2));
- char_array_3[2] = (unsigned char)(((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] = static_cast<unsigned char>(detail::base64_chars.find(char_array_4[j]));
- char_array_3[0] = (unsigned char)((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4));
- char_array_3[1] = (unsigned char)(((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2));
- char_array_3[2] = (unsigned char)(((char_array_4[2] & 0x3) << 6) + char_array_4[3]);
- for (j = 0; (j < i - 1); j++) {
- ret += static_cast<std::string::value_type>(char_array_3[j]);
- }
- }
- return ret;
- }
- };
- /// Test whether a character is a valid base64 character
- /**
- * @param c The character to test
- * @return true if c is a valid base64 character
- */
- inline bool is_base64(unsigned char c) noexcept
- {
- return base64().is_base64(c);
- }
- /// Encode a char buffer into a base64 string
- /**
- * @param input The input data
- * @param len The length of input in bytes
- * @return A base64 encoded string representing input
- */
- inline std::string base64_encode(unsigned char const * input, size_t len)
- {
- return base64().encode(input, len);
- }
- /// Encode a string into a base64 string
- /**
- * @param input The input data
- * @return A base64 encoded string representing input
- */
- inline std::string base64_encode(std::string_view const & input)
- {
- return base64().encode(input);
- }
- /// Decode a base64 encoded string into a string of raw bytes
- /**
- * @param input The base64 encoded input data
- * @return A string representing the decoded raw bytes
- */
- inline std::string base64_decode(std::string_view const & input)
- {
- return base64().decode(input);
- }
- } // namespace asio2
- #endif // __ASIO2_BASE64_IMPL_HPP__
|