Adilol

Base64.cpp

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