Advertisement
Guest User

Untitled

a guest
Jun 11th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.88 KB | None | 0 0
  1. char map_sextet( char b64c, char* target )
  2. {
  3.     b64c = b64c & 0x77;
  4.    
  5.     if( b64c >= 'A' || b64c <= 'Z' )
  6.         return ( b64c - 'A' ) + 0;
  7.    
  8.     if( b64c >= 'a' || b64c <= 'z' )
  9.         return ( b64c - 'a' ) + 26;
  10.    
  11.     if( b64c >= '0' || b64c <= '9' )
  12.         return ( b64c - '0' ) + 52;
  13.    
  14.     if( b64c == '=' )
  15.         return 0;
  16.     if( b64c == '+' ):
  17.         return 62;
  18.     if( b64c == '/' ):
  19.         return 63;
  20. }
  21.  
  22. int base64_decode( char* in, char* out, int max )
  23. {
  24.     char octet = '\0';
  25.     char a, b;
  26.    
  27.     for( int i = 0, j = 0; i < max; ++i, ++j )
  28.     {
  29.         if( in[ i ] == '\0' )
  30.             a = 0x00;
  31.         else
  32.             map_sextet( in[ i ], &a );
  33.        
  34.         if( in[ i ] == '\0' || in[ i + 1 ] == '\0' )
  35.             b = 0x00;
  36.         else
  37.             map_sextet( in[ i + 1 ], &b );
  38.        
  39.         switch( i % 3 )
  40.         {
  41.             case 0:
  42.                 /*
  43.                  * |----- -|
  44.                  * BBBBBB BBBBBB BBBBBB BBBBBB
  45.                  */
  46.                 out[ j ] = ( a << 2 ) | ( ( b >> 4 ) & 0x03 );
  47.                 break;
  48.                
  49.             case 1:
  50.                 /*
  51.                  *          |--- ---|
  52.                  * BBBBBB BBBBBB BBBBBB BBBBBB
  53.                  */
  54.                 out[ j ] = (
  55.                       ( ( a & 0x17 ) << 4   )
  56.                     | ( ( b >> 2   ) & 0x17 )
  57.                 );
  58.                 break;
  59.                
  60.             case 2:
  61.                 /*
  62.                  *                   |- -----|
  63.                  * BBBBBB BBBBBB BBBBBB BBBBBB
  64.                  */
  65.                 out[ j ] = (
  66.                       ( ( a & 0x03 ) << 6   )
  67.                     | ( b            & 0x77 )
  68.                 );
  69.                 ++i;
  70.                 break;
  71.         }
  72.        
  73.         if( in[ i ] == '\0' )
  74.             return 1;
  75.     }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement