Advertisement
Shiny_

base64.inc

Sep 1st, 2013
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 4.40 KB | None | 0 0
  1. // Conditions:
  2.     #if defined _base64_included
  3.         #endinput
  4.     #endif
  5.     #define _base64_included
  6.  
  7. // Macros:
  8.     #define e:base64(%0,%1) encode(%0,%1)
  9.     #define d:base64(%0,%1) decode(%0,%1)
  10.    
  11. // Variables:
  12.     new const LettersTable[] = {
  13.         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  14.     };
  15.    
  16.     new const Decoder[] = {
  17.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  18.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  19.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  20.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  21.         0,  0,  0,  62, 0,  0,  0,  63, 52, 53,
  22.         54, 55, 56, 57, 58, 59, 60, 61, 0,  0,
  23.         0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
  24.         5,  6,  7,  8,  9,  10, 11, 12, 13, 14,
  25.         15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
  26.         25, 0,  0,  0,  0,  0,  0,  26, 27, 28,
  27.         29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
  28.         39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
  29.         49, 50, 51, 0,  0,  0,  0,  0,  0,  0,
  30.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  31.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  32.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  33.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  34.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  35.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  36.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  37.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  38.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  39.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  40.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  41.         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  42.         0,  0,  0,  0,  0,  0
  43.     };
  44.  
  45. // Functions:
  46.     /** Funkcja:
  47.      * decode
  48.      - string[] Dekoduje ciąg znaków.
  49.      - second_string[] Przechowuje zdekodowany ciąg znaków z parametru string[]
  50.     **/
  51.     stock decode(const string[], second_string[]) {
  52.         /** Zmienne:
  53.          *  SpaceReplacer - zamienia spacje na znaki równości;
  54.          *  len - oznacza długość zakodowanego ciągu znaków string[];
  55.          *  Position - oznacza pozycję w ciągu znaków;
  56.         **/
  57.        
  58.         new const SpaceReplacer = '=';
  59.         new len = strlen(string);
  60.         new Position;
  61.        
  62.         /** Zmienne:
  63.          *  i - tworzy zwykłą wartość typu int o wartości zero;
  64.          *  char_[2] - oznacza przypisany znak w ciągu do zdekodowania;
  65.         **/
  66.        
  67.         for(new i = 0 ; i < len ; i++) {
  68.             new char_[2];
  69.             char_[0] = Decoder[string[i++]];
  70.             char_[1] = Decoder[string[i]];
  71.             char_[0] = (char_[0] << 2) | ((char_[1] >> 4) & 3);
  72.             Position += format(second_string[Position], len, "%c", char_[0]);
  73.            
  74.             if(++i < len) {
  75.                 char_[0] = string[i];
  76.                 if(char_[0] == SpaceReplacer)
  77.                     break;
  78.                 char_[0] = Decoder[string[i]];
  79.                 char_[1] = ((char_[1] << 4) & 240) | ((char_[0] >> 2) & 15);
  80.                 Position += format(second_string[Position], len, "%c", char_[1]);
  81.             }
  82.            
  83.             if(++i < len) {
  84.                 char_[1] = string[i];
  85.                 if(char_[1] == SpaceReplacer)
  86.                     break;
  87.                 char_[1] = Decoder[string[i]];
  88.                 char_[0] = ((char_[0] << 6) & 192) | char_[1];
  89.                 Position += format(second_string[Position], len, "%c", char_[0]);
  90.             }
  91.         }
  92.         return true;
  93.     }
  94.    
  95.     /** Funkcja:
  96.      * encode
  97.      - string[] Koduje ciąg znaków.
  98.      - second_string[] Przechowuje zakodowany ciąg znaków z parametru string[]
  99.     **/
  100.     stock encode(const string[], second_string[]) {
  101.         /** Zmienne:
  102.          *  SpaceReplacer - zamienia spacje na znaki równości;
  103.          *  len - oznacza długość zakodowanego ciągu znaków string[];
  104.          *  Position - oznacza pozycję w ciągu znaków;
  105.         **/
  106.        
  107.         new const SpaceReplacer = '=';
  108.         new len = strlen(string);
  109.         new Position;
  110.        
  111.         /** Zmienne:
  112.          *  i - tworzy zwykłą wartość typu int o wartości zero;
  113.          *  Character - oznacza przypisany znak w ciągu do zakodowania;
  114.         **/
  115.        
  116.         for(new i = 0 ; i < len ; i++) {
  117.             new Character;
  118.             Character = (string[i] >> 2) & 63;
  119.             Position += format(second_string[Position], len, "%c", LettersTable[Character]);
  120.             Character = (string[i] << 4) & 63;
  121.            
  122.             if(++i < len)
  123.                 Character |= (string[i] >> 4) & 15;
  124.             Position += format(second_string[Position], len, "%c", LettersTable[Character]);
  125.    
  126.             if(i < len) {
  127.                 Character = (string[i] << 2) & 63;
  128.                
  129.                 if(++i < len)
  130.                     Character |= (string[i] >> 6) & 3;
  131.                 Position += format(second_string[Position], len, "%c", LettersTable[Character]);
  132.             } else {
  133.                 i++;
  134.                 Position += format(second_string[Position], len, "%c", SpaceReplacer);
  135.             }
  136.    
  137.             if(i < len) {
  138.                 Character = string[i] & 63;
  139.                 Position += format(second_string[Position], len, "%c", LettersTable[Character]);
  140.             }
  141.             else Position += format(second_string[Position], len, "%c", SpaceReplacer);
  142.         }
  143.         return true;
  144.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement