00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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 }