base64算法
#include"base64.h"const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char * base64_encode( unsigned char * bindata, char * base64, int binlength )
{
int i, j;
unsigned char current;
for ( i = 0, j = 0 ; i < binlength ; i += 3 )
{
current = (bindata >> 2) ;
current &= (unsigned char)0x3F;
base64 = base64char[(int)current];
current = ( (unsigned char)(bindata << 4 ) ) & ( (unsigned char)0x30 ) ;
if ( i + 1 >= binlength )
{
base64 = base64char[(int)current];
base64 = '=';
base64 = '=';
break;
}
current |= ( (unsigned char)(bindata >> 4) ) & ( (unsigned char) 0x0F );
base64 = base64char[(int)current];
current = ( (unsigned char)(bindata << 2) ) & ( (unsigned char)0x3C ) ;
if ( i + 2 >= binlength )
{
base64 = base64char[(int)current];
base64 = '=';
break;
}
current |= ( (unsigned char)(bindata >> 6) ) & ( (unsigned char) 0x03 );
base64 = base64char[(int)current];
current = ( (unsigned char)bindata ) & ( (unsigned char)0x3F ) ;
base64 = base64char[(int)current];
}
base64 = '\0';
return base64;
}
int base64_decode(char * base64, unsigned char * bindata )
{
int i, j;
unsigned char k;
unsigned char temp;
for ( i = 0, j = 0; base64 != '\0' ; i += 4 )
{
memset( temp, 0xFF, sizeof(temp) );
for ( k = 0 ; k < 64 ; k ++ )
{
if ( base64char == base64 )
temp= k;
}
for ( k = 0 ; k < 64 ; k ++ )
{
if ( base64char == base64 )
temp= k;
}
for ( k = 0 ; k < 64 ; k ++ )
{
if ( base64char == base64 )
temp= k;
}
for ( k = 0 ; k < 64 ; k ++ )
{
if ( base64char == base64 )
temp= k;
}
bindata = ((unsigned char)(((unsigned char)(temp << 2))&0xFC)) |
((unsigned char)((unsigned char)(temp>>4)&0x03));
if ( base64 == '=' )
break;
bindata = ((unsigned char)(((unsigned char)(temp << 4))&0xF0)) |
((unsigned char)((unsigned char)(temp>>2)&0x0F));
if ( base64 == '=' )
break;
bindata = ((unsigned char)(((unsigned char)(temp << 6))&0xF0)) |
((unsigned char)(temp&0x3F));
}
return j;
}
页:
[1]