base64.cpp

00001 /*
00002   Copyright (c) 2005-2006 by Jakob Schroeter <js@camaya.net>
00003   This file is part of the gloox library. http://camaya.net/gloox
00004 
00005   This software is distributed under a license. The full license
00006   agreement can be found in the file LICENSE in this distribution.
00007   This software may not be copied, modified, sold or distributed
00008   other than expressed in the named license agreement.
00009 
00010   This software is distributed without any warranty.
00011 */
00012 
00013 
00014 #include "base64.h"
00015 
00016 namespace gloox
00017 {
00018 
00019   const std::string Base64::alphabet64( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" );
00020   const char Base64::pad = '=';
00021 
00022   const std::string::size_type Base64::np = std::string::npos;
00023   const std::string::size_type Base64::table64[] =
00024   {
00025     np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np,
00026     np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np,
00027     np, np, np, 62, np, np, np, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, np, np,
00028     np, np, np, np, np,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
00029     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, np, np, np, np, np, np, 26, 27, 28,
00030     29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
00031     49, 50, 51, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np,
00032     np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np,
00033     np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np,
00034     np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np,
00035     np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np,
00036     np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np,
00037     np, np, np, np, np, np, np, np, np, np, np, np, np, np, np, np
00038   };
00039 
00040   const std::string Base64::encode64( const std::string& input )
00041   {
00042     std::string encoded;
00043     char c;
00044     const std::string::size_type length = input.length();
00045 
00046     encoded.reserve( length * 2 );
00047 
00048     for( std::string::size_type i = 0; i < length; ++i )
00049     {
00050       c = ( input[i] >> 2 ) & 0x3f;
00051       encoded.append( 1, alphabet64[c] );
00052 
00053       c = ( input[i] << 4 ) & 0x3f;
00054       if( ++i < length )
00055         c |= ( ( input[i] >> 4 ) & 0x0f );
00056       encoded.append( 1, alphabet64[c] );
00057 
00058       if( i < length )
00059       {
00060         c = ( input[i] << 2 ) & 0x3c;
00061         if( ++i < length )
00062           c |= ( input[i] >> 6 ) & 0x03;
00063         encoded.append( 1, alphabet64[c] );
00064       }
00065       else
00066       {
00067         ++i;
00068         encoded.append( 1, pad );
00069       }
00070 
00071       if( i < length )
00072       {
00073         c = input[i] & 0x3f;
00074         encoded.append( 1, alphabet64[c] );
00075       }
00076       else
00077       {
00078         encoded.append( 1, pad );
00079       }
00080     }
00081 
00082     return encoded;
00083   }
00084 
00085   const std::string Base64::decode64( const std::string& input )
00086   {
00087     char c, d;
00088     const std::string::size_type length = input.length();
00089     std::string decoded;
00090 
00091     decoded.reserve( length );
00092 
00093     for( std::string::size_type i = 0; i < length; ++i )
00094     {
00095       c = (char)table64[(unsigned char)input[i]];
00096       ++i;
00097       d = (char)table64[(unsigned char)input[i]];
00098       c = ( c << 2 ) | ( ( d >> 4 ) & 0x3 );
00099       decoded.append( 1, c );
00100       if( ++i < length )
00101       {
00102         c = input[i];
00103         if( pad == c )
00104           break;
00105 
00106         c = (char)table64[(unsigned char)input[i]];
00107         d = ( ( d << 4 ) & 0xf0 ) | ( ( c >> 2 ) & 0xf );
00108         decoded.append( 1, d );
00109       }
00110 
00111       if( ++i < length )
00112       {
00113         d = input[i];
00114         if( pad == d )
00115           break;
00116 
00117         d = (char)table64[(unsigned char)input[i]];
00118         c = ( ( c << 6 ) & 0xc0 ) | d;
00119         decoded.append( 1, c );
00120       }
00121     }
00122 
00123     return decoded;
00124   }
00125 
00126 }

Generated on Tue May 1 14:20:20 2007 for gloox by  doxygen 1.5.1