@ -443,7 +443,6 @@ vector<unsigned char> ParseHex(const string& str)
return ParseHex ( str . c_str ( ) ) ;
return ParseHex ( str . c_str ( ) ) ;
}
}
void ParseParameters ( int argc , char * argv [ ] )
void ParseParameters ( int argc , char * argv [ ] )
{
{
mapArgs . clear ( ) ;
mapArgs . clear ( ) ;
@ -470,6 +469,59 @@ void ParseParameters(int argc, char* argv[])
}
}
}
}
string EncodeBase64 ( const unsigned char * pch , size_t len )
{
static const char * pbase64 = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ " ;
string strRet = " " ;
strRet . reserve ( ( len + 2 ) / 3 * 4 ) ;
int mode = 0 , left = 0 ;
const unsigned char * pchEnd = pch + len ;
while ( pch < pchEnd )
{
int enc = * ( pch + + ) ;
switch ( mode )
{
case 0 : // we have no bits
strRet + = pbase64 [ enc > > 2 ] ;
left = ( enc & 3 ) < < 4 ;
mode = 1 ;
break ;
case 1 : // we have two bits
strRet + = pbase64 [ left | ( enc > > 4 ) ] ;
left = ( enc & 15 ) < < 2 ;
mode = 2 ;
break ;
case 2 : // we have four bits
strRet + = pbase64 [ left | ( enc > > 6 ) ] ;
strRet + = pbase64 [ enc & 63 ] ;
mode = 0 ;
break ;
}
}
if ( mode )
{
strRet + = pbase64 [ left ] ;
strRet + = ' = ' ;
if ( mode = = 1 )
strRet + = ' = ' ;
}
return strRet ;
}
string EncodeBase64 ( const string & str )
{
return EncodeBase64 ( ( const unsigned char * ) str . c_str ( ) , str . size ( ) ) ;
}
vector < unsigned char > DecodeBase64 ( const char * p , bool * pfInvalid )
{
static const int decode64_table [ 256 ] =
static const int decode64_table [ 256 ] =
{
{
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
@ -487,18 +539,20 @@ static const int decode64_table[256]=
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1
} ;
} ;
std : : string DecodeBase64 ( const std : : string & s )
if ( pfInvalid )
{
* pfInvalid = false ;
char buf [ 1024 ] ;
if ( s . length ( ) > 512 ) return " " ;
char * optr = buf ;
int dec , mode = 0 , left = 0 ;
vector < unsigned char > vchRet ;
size_t index = 0 ;
vchRet . reserve ( strlen ( p ) * 3 / 4 ) ;
for ( int i = 0 ; i < s . length ( ) ; i + + )
int mode = 0 ;
int left = 0 ;
while ( 1 )
{
{
dec = decode64_table [ s [ i ] ] ;
int dec = decode64_table [ * p ] ;
if ( dec = = - 1 ) break ;
if ( dec = = - 1 ) break ;
p + + ;
switch ( mode )
switch ( mode )
{
{
case 0 : // we have no bits and get 6
case 0 : // we have no bits and get 6
@ -507,28 +561,53 @@ std::string DecodeBase64(const std::string &s)
break ;
break ;
case 1 : // we have 6 bits and keep 4
case 1 : // we have 6 bits and keep 4
* optr + + = ( left < < 2 ) | ( dec > > 4 ) ;
vchRet . push_back ( ( left < < 2 ) | ( dec > > 4 ) ) ;
left = dec & 15 ;
left = dec & 15 ;
mode = 2 ;
mode = 2 ;
break ;
break ;
case 2 : // we have 4 bits and get 6, we keep 2
case 2 : // we have 4 bits and get 6, we keep 2
* optr + + = ( left < < 4 ) | ( dec > > 2 ) ;
vchRet . push_back ( ( left < < 4 ) | ( dec > > 2 ) ) ;
left = dec & 3 ;
left = dec & 3 ;
mode = 3 ;
mode = 3 ;
break ;
break ;
case 3 : // we have 2 bits and get 6
case 3 : // we have 2 bits and get 6
* optr + + = ( left < < 6 ) | dec ;
vchRet . push_back ( ( left < < 6 ) | dec ) ;
mode = 0 ;
mode = 0 ;
break ;
break ;
}
}
}
}
* optr = 0 ;
if ( pfInvalid )
return buf ;
switch ( mode )
{
case 0 : // 4n base64 characters processed: ok
break ;
case 1 : // 4n+1 base64 character processed: impossible
* pfInvalid = true ;
break ;
case 2 : // 4n+2 base64 characters processed: require '=='
if ( left | | p [ 0 ] ! = ' = ' | | p [ 1 ] ! = ' = ' | | decode64_table [ p [ 2 ] ] ! = - 1 )
* pfInvalid = true ;
break ;
case 3 : // 4n+3 base64 characters processed: require '='
if ( left | | p [ 0 ] ! = ' = ' | | decode64_table [ p [ 1 ] ] ! = - 1 )
* pfInvalid = true ;
break ;
}
return vchRet ;
}
}
string DecodeBase64 ( const string & str )
{
vector < unsigned char > vchRet = DecodeBase64 ( str . c_str ( ) ) ;
return string ( ( const char * ) & vchRet [ 0 ] , vchRet . size ( ) ) ;
}
bool WildcardMatch ( const char * psz , const char * mask )
bool WildcardMatch ( const char * psz , const char * mask )