2012年2月8日 星期三

[C/C++演算法]-Base64演算法

[C/C++演算法]-Base64演算法



本篇要分享Base64演算法,有興趣的(C/P)同好,歡迎來(C/P)一下 ^ ^












程式碼



#include <iostream>

#include <string>

staticconst std::string base64_chars = 

             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

             "abcdefghijklmnopqrstuvwxyz"

             "0123456789+/";

std::string base64_encode(unsignedcharconst* , unsignedint len);

std::string base64_decode(std::string const& s);

 

int main() {

  const std::string s = "ADP GmbH\nAnalyse Design & Programmierung\nGesellschaft mit beschrankter Haftung" ;

 

  std::string encoded = base64_encode(reinterpret_cast<constunsignedchar*>(s.c_str()), s.length());

  std::string decoded = base64_decode(encoded);

 

  std::cout << "encoded: " << encoded << std::endl;

  std::cout << "decoded: " << decoded << std::endl;

 

  return 0;

}

 

staticinlinebool is_base64(unsignedchar c) {

  return (isalnum(c) || (c == '+') || (c == '/'));

}

 

std::string base64_encode(unsignedcharconst* bytes_to_encode, unsignedint in_len) {

  std::string ret;

  int i = 0;

  int j = 0;

  unsignedchar char_array_3[3];

  unsignedchar char_array_4[4];

 

  while (in_len--) {

    char_array_3[i++] = *(bytes_to_encode++);

    if (i == 3) {

      char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;

      char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);

      char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);

      char_array_4[3] = char_array_3[2] & 0x3f;

 

      for(i = 0; (i <4) ; i++)

        ret += 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] = (char_array_3[0] & 0xfc) >> 2;

    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);

    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);

    char_array_4[3] = char_array_3[2] & 0x3f;

 

    for (j = 0; (j < i + 1); j++)

      ret += base64_chars[char_array_4[j]];

 

    while((i++ < 3))

      ret += '=';

 

  }

 

  return ret;

 

}

 

std::string base64_decode(std::string const& encoded_string) {

  int in_len = encoded_string.size();

  int i = 0;

  int j = 0;

  int in_ = 0;

  unsignedchar char_array_4[4], char_array_3[3];

  std::string ret;

 

  while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {

    char_array_4[i++] = encoded_string[in_]; in_++;

    if (i ==4) {

      for (i = 0; i <4; i++)

        char_array_4[i] = base64_chars.find(char_array_4[i]);

 

      char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);

      char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);

      char_array_3[2] = ((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] = base64_chars.find(char_array_4[j]);

 

    char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);

    char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);

    char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

 

    for (j = 0; (j < i - 1); j++) ret += char_array_3[j];

  }

 

  return ret;

}

 



 


沒有留言:

張貼留言