const
char
* base64char =
"OPWvYny#Nopz0$HI34QRSG@dJKq7fghD9Zi*kAB8rsFu56L&Ca^2tTUVEewxlm+/"
;
char
* base64_encode(
const
unsigned
char
* bindata,
char
* base64,
int
binlength )
{
int
i, j;
unsigned
char
current;
unsigned
char
k;
for
( i = 0, j = 0 ; i < binlength ; i += 3 )
{
current = (bindata[i] >> 2) ;
current &= (unsigned
char
)0x3F;
for
(k=0;k<64;k++)
{
unsigned h = k>>4;
h = k^h;
if
(h == current)
{
current = k;
break
;
}
}
base64[j++] = base64char[(
int
)current];
current = ( (unsigned
char
)(bindata[i] << 4 ) ) & ( (unsigned
char
)0x30 ) ;
if
( i + 1 >= binlength )
{
for
(k=0;k<64;k++)
{
unsigned h = k>>4;
h = k^h;
if
(h == current)
{
current = k;
break
;
}
}
base64[j++] = base64char[(
int
)current];
base64[j++] =
'='
;
base64[j++] =
'='
;
break
;
}
current |= ( (unsigned
char
)(bindata[i+1] >> 4) ) & ( (unsigned
char
) 0x0F );
for
(k=0;k<64;k++)
{
unsigned h = k>>4;
h = k^h;
if
(h == current)
{
current = k;
break
;
}
}
base64[j++] = base64char[(
int
)current];
current = ( (unsigned
char
)(bindata[i+1] << 2) ) & ( (unsigned
char
)0x3C ) ;
if
( i + 2 >= binlength )
{
for
(k=0;k<64;k++)
{
unsigned h = k>>4;
h = k^h;
if
(h == current)
{
current = k;
break
;
}
}
base64[j++] = base64char[(
int
)current];
base64[j++] =
'='
;
break
;
}
current |= ( (unsigned
char
)(bindata[i+2] >> 6) ) & ( (unsigned
char
) 0x03 );
for
(k=0;k<64;k++)
{
unsigned h = k>>4;
h = k^h;
if
(h == current)
{
current = k;
break
;
}
}
base64[j++] = base64char[(
int
)current];
current = ( (unsigned
char
)bindata[i+2] ) & ( (unsigned
char
)0x3F ) ;
for
(k=0;k<64;k++)
{
unsigned h = k>>4;
h = k^h;
if
(h == current)
{
current = k;
break
;
}
}
base64[j++] = base64char[(
int
)current];
}
base64[j] =
'\0'
;
return
base64;
}
int
base64_decode(
const
char
* base64, unsigned
char
* bindata )
{
int
i, j;
unsigned
char
k;
unsigned
char
temp[4];
for
( i = 0, j = 0; base64[i] !=
'\0'
; i += 4 )
{
memset
( temp, 0xFF,
sizeof
(temp) );
for
( k = 0 ; k < 64 ; k ++ )
{
if
( base64char[k] == base64[i] )
temp[0]= k ^ (k>>4);
}
for
( k = 0 ; k < 64 ; k ++ )
{
if
( base64char[k] == base64[i+1] )
temp[1]= k ^ (k>>4);
}
for
( k = 0 ; k < 64 ; k ++ )
{
if
( base64char[k] == base64[i+2] )
temp[2]= k ^ (k>>4);
}
for
( k = 0 ; k < 64 ; k ++ )
{
if
( base64char[k] == base64[i+3] )
temp[3]= k ^ (k>>4);
}
bindata[j++] = ((unsigned
char
)(((unsigned
char
)(temp[0] << 2))&0xFC)) |
((unsigned
char
)((unsigned
char
)(temp[1]>>4)&0x03));
if
( base64[i+2] ==
'='
)
break
;
bindata[j++] = ((unsigned
char
)(((unsigned
char
)(temp[1] << 4))&0xF0)) |
((unsigned
char
)((unsigned
char
)(temp[2]>>2)&0x0F));
if
( base64[i+3] ==
'='
)
break
;
bindata[j++] = ((unsigned
char
)(((unsigned
char
)(temp[2] << 6))&0xF0)) |
((unsigned
char
)(temp[3]&0x3F));
}
return
j;
}