Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* Author: PaulCodeman
  2.         Example:
  3.         char bufferb64[0x1000] = {0};
  4.         base64_encode("Kevin van Zonneveld",#bufferb64, 19);
  5.         #bufferb64 == "S2V2aW4gdmFuIFpvbm5ldmVsZA=="
  6. */
  7.  
  8. :dword b64_symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  9. inline void base64_encode(dword data, buffer, length)
  10. {
  11.         byte o1 = 0;
  12.         byte o2 = 0;
  13.         byte o3 = 0;
  14.         dword bits = 0;
  15.         dword h1 = 0;
  16.         dword h2 = 0;
  17.         dword h3 = 0;
  18.         dword h4 = 0;
  19.        
  20.         dword end = 0;
  21.         end = data+length;
  22.        
  23.         do
  24.         {
  25.                 o1 = DSBYTE[data];data++;
  26.                 if (data < end) {o2 = DSBYTE[data];data++;} else o2 = 0;
  27.                 if (data < end) {o3 = DSBYTE[data];data++;} else o3 = 0;
  28.                
  29.                 bits = o1<<16;
  30.                 bits |= o2<<8;
  31.                 bits |= o3;
  32.                
  33.                 h1 = bits>>18 & 0x3f;
  34.                 h2 = bits>>12 & 0x3f;
  35.                 h3 = bits>>6 & 0x3f;
  36.                 h4 = bits & 0x3f;
  37.                
  38.                 DSBYTE[buffer] = DSBYTE[#b64_symbols+h1];buffer++;
  39.                 DSBYTE[buffer] = DSBYTE[#b64_symbols+h2];buffer++;
  40.                 DSBYTE[buffer] = DSBYTE[#b64_symbols+h3];buffer++;
  41.                 DSBYTE[buffer] = DSBYTE[#b64_symbols+h4];buffer++;
  42.         } while(end > data);
  43.         switch(length % 3)
  44.         {
  45.                 case 1:
  46.                         buffer--;
  47.                         DSBYTE[buffer] = '=';
  48.                         buffer--;
  49.                         DSBYTE[buffer] = '=';
  50.                         buffer+=2;
  51.                 break;
  52.                 case 2:
  53.                         buffer--;
  54.                         DSBYTE[buffer] = '=';
  55.                         buffer++;
  56.                 break;
  57.         }
  58.         DSBYTE[buffer] = 0;
  59. }
  60.