Guest User

Base64.cpp

a guest
Dec 12th, 2016
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1. #include "Header/Base64.hpp"
  2. #include <iostream>
  3.  
  4. using namespace Alice;
  5.  
  6. static const std::string base64_chars =
  7.              "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  8.              "abcdefghijklmnopqrstuvwxyz"
  9.              "0123456789+/";
  10.  
  11.  
  12. static inline bool is_base64(unsigned char c) {
  13.   return (isalnum(c) || (c == '+') || (c == '/'));
  14. }
  15.  
  16. std::string Encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
  17.   std::string ret;
  18.   int i = 0;
  19.   int j = 0;
  20.   unsigned char char_array_3[3];
  21.   unsigned char char_array_4[4];
  22.  
  23.   while (in_len--) {
  24.     char_array_3[i++] = *(bytes_to_encode++);
  25.     if (i == 3) {
  26.       char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  27.       char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
  28.       char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
  29.       char_array_4[3] = char_array_3[2] & 0x3f;
  30.  
  31.       for(i = 0; (i <4) ; i++)
  32.         ret += base64_chars[char_array_4[i]];
  33.       i = 0;
  34.     }
  35.   }
  36.  
  37.   if (i)
  38.   {
  39.     for(j = i; j < 3; j++)
  40.       char_array_3[j] = '\0';
  41.  
  42.     char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  43.     char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
  44.     char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
  45.     char_array_4[3] = char_array_3[2] & 0x3f;
  46.  
  47.     for (j = 0; (j < i + 1); j++)
  48.       ret += base64_chars[char_array_4[j]];
  49.  
  50.     while((i++ < 3))
  51.       ret += '=';
  52.  
  53.   }
  54.  
  55.   return ret;
  56.  
  57. }
  58.  
  59. std::string Decode(std::string encoded_string) {
  60.   int in_len = encoded_string.size();
  61.   int i = 0;
  62.   int j = 0;
  63.   int in_ = 0;
  64.   unsigned char char_array_4[4], char_array_3[3];
  65.   std::string ret;
  66.  
  67.   while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
  68.     char_array_4[i++] = encoded_string[in_]; in_++;
  69.     if (i ==4) {
  70.       for (i = 0; i <4; i++)
  71.         char_array_4[i] = base64_chars.find(char_array_4[i]);
  72.  
  73.       char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
  74.       char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
  75.       char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
  76.  
  77.       for (i = 0; (i < 3); i++)
  78.         ret += char_array_3[i];
  79.       i = 0;
  80.     }
  81.   }
  82.  
  83.   if (i) {
  84.     for (j = i; j <4; j++)
  85.       char_array_4[j] = 0;
  86.  
  87.     for (j = 0; j <4; j++)
  88.       char_array_4[j] = base64_chars.find(char_array_4[j]);
  89.  
  90.     char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
  91.     char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
  92.     char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
  93.  
  94.     for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
  95.   }
  96.  
  97.   return ret;
  98. }
Add Comment
Please, Sign In to add comment