YLLEN

要去看埃菲尔铁塔的顶

欢迎关注本人微博:t.cn/RGSLVUk

Base64编码

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++;

}








评论

© YLLEN | Powered by LOFTER