要去看埃菲尔铁塔的顶
欢迎关注本人微博:t.cn/RGSLVUk
Base64编码的原理:
3 * 8 = 4 * 6
也就是三个字节变成四个字节,按照其对应的数值在编码表中找出来对应的,如果不够3的倍数,那么就要补0,然后加 = 号 ( 一个 或 两个 );
char base64hash[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int i = 0 , len = strlen(var);
char flag = 0; // 标志一组的结束
char tmp , tmp2, prev ;
char* p = var;
while( i < len && *p )
{
switch (i % 3 )
{
case 0:
{
tmp = ((*p) >> 2);
prev = *p;//保存一下
//printf("[ %d , %c] \n", tmp , base64hash[tmp] );
printf("%c",base64hash[tmp] );
break;
}
case 1:
{
tmp = 0x3f & ( ( ( prev & 0x3 ) << 4 ) | ( * (p + 1) >> 4 ) ) ;
prev = * (p + 1);//保存一下
//printf("[ %d , %c] \n", tmp , base64hash[tmp] );
printf("%c",base64hash[tmp] );
break;
}
case 2:
{
tmp = 0x3f & ((( prev & 0x0f ) << 2) | ( ( * (p + 2 ) & 0xc0)) >> 6);
tmp2 = 0x3f & * (p + 2) ;
//printf("[ %d , %c] \n", tmp , base64hash[tmp] );
//printf("[ %d , %c] \n", tmp2 , base64hash[tmp2] );
printf("%c",base64hash[tmp] );
printf("%c",base64hash[tmp2] );
flag = 1;
break;
}
}
i++;
if( flag )
{
p += 3;
flag = 0;
}
}
if( i%3 == 1) //补齐 2 位
{
tmp2 = ((var[len-1])&0x3) << 4;
printf("%c==",base64hash[tmp2]);
}
else if( i%3 == 2) //补齐 1位
{
tmp2 = ((var[len-1])&0xf) << 2;
printf("%c=",base64hash[tmp2]);
}
------------------------解码
void Base64Decode(char * var , int len )
{
//从后面往前 进行解码
//
int i = 0 ;
char flag = 0;
char tmp[4] = {0};
char* p = var;
// 四个一组
// 找出序号
// 然后再看
while( i < len && *p)
{
tmp[ i % 4] = Getbase64HashIndex(*p);
//printf("%d " ,tmp[ i % 4]);
if( ( i%4) == 3)//凑齐了4个数
{
//
if( *p != '=')
{
tmp[0] = (tmp[0] << 2) | (tmp[1] >> 4);
tmp[1] = ((tmp[1] & 0x0F) << 4) | ( tmp[2] >> 2);
tmp[2] = ( (tmp[2] & 0x03) << 0x6) | (tmp[3]);
printf("%c%c%c",tmp[0],tmp[1],tmp[2]);
memset(tmp , 0 , 4);
}
else
{
if( *( p - 1 ) == '=')// 两个等号
{
tmp[0] = (tmp[0] << 2) | (tmp[1] >> 4);
printf("%c",tmp[0]);
}
else//一个
{
tmp[0] = (tmp[0] << 2) | (tmp[1] >> 4);
tmp[1] = ((tmp[1] & 0x0F) << 4) | ( tmp[2] >> 2);
printf("%c%c",tmp[0] ,tmp[1]);
}
}
}
i++;
p++;
}
}