2013年5月18日 星期六

[Linux C]-BASE64編/解碼

[Linux C]-BASE64/解碼



本篇要分享Linux C-BASE64/解碼程式,有興趣的(C/P)同好,歡迎來(C/P)一下哈哈 ^ ^









/*    http://hi.baidu.com/wangpeng1314/item/c348450ff53bc16ed55a11ac    */

//base64.h

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<string.h>

 

externchar *base64_decode(constchar*,char **);

 

externchar *base64_encode(constchar*,char **);

 

/////////////////////////////////////////////////////

 

//base64.c

#include "base64.h"

staticchar base64_table[255];

void base64_tableinit()

{

    int i,j;

    bzero(base64_table,255);

    for(j=0,i='A';i<='Z';i++) /*base64編碼表*/

        base64_table[i]=j++;

    for(i='a';i<='z';i++)

        base64_table[i]=j++;

    for(i='0';i<='9';i++)

        base64_table[i]=j++;

        base64_table['+']=j++;

        base64_table['/']=j++;

        base64_table['=']=j;

}

char* base64_decode(constchar *cptr,char **rptr)

{

    char *res;

    int clen,len;

    staticint init=0;

    if(cptr==NULL)

        return NULL;

    

    len=strlen(cptr);

    

    if(len%4) /*編了碼的字元絕對是4的倍數*/

        return NULL;

 

    if(!init)

    {

        init=1;

        base64_tableinit();

    }

    

    clen=len/4;

    if((res=(char *)malloc(len-clen))==NULL)

        return NULL;

    

    for(*rptr=res;clen--;)

    {

        

        *res=base64_table[*cptr++]<<2&0xfc;         /*cptr後六位移動到最高位*/

        *res++|=base64_table[*cptr]>>4;               /*跟著下個字元低兩位元給res低兩位*/

        *res=base64_table[*cptr++]<<4&0xf0;               /*填充res高四位其他清0*/

        *res++|=base64_table[*cptr]>>2&0x0f;    /*字元前六位移到低六位取低四位*/

        *res=base64_table[*cptr++]<<6;

        if(*cptr!='=')                                                 /*=號乎略*/

        *res++|=base64_table[*cptr++];

    }

    return *rptr;

 

}

 

char* base64_encode(constchar *cptr,char **rptr)

{

    char *res;

    int i,clen,len;

    

    len=strlen(cptr);

    clen=len/3;

    

    if(cptr==NULL||(res=(char *)malloc(clen+3*2+len))==NULL)

        return NULL;

 

    for(*rptr=res;clen--;)

     {

        *res++=*cptr >> 2 & 0x3f;          /*ptr6位放入res6*/

        *res=*cptr++ << 4 & 0x30;          /*移動ptr最低2位到高6位然後清0它位*/

        *res++|=*cptr >> 4;                  /*ptr4位給res4*/

        *res=( *cptr++ & 0x0f ) << 2;        /*ptr4位移動到高6*/

        *res++|=*cptr>>6;                  /*ptr2位給res2*/

        *res++=*cptr++ & 0x3f;

    }

 

    if(i=len%3)                                       /*處理多餘字元只有兩種情況多一個或者兩個字元*/

    {

        if(i==1)                                    /*根據base64編碼補=*/

        {

            *res++=*cptr >> 2 & 0x3f;

            *res++=*cptr << 4 & 0x30;

            *res++='=';

            *res++='=';

        }

        else

        {

            *res++=*cptr>>2&0x3f;

            *res=*cptr++<<4&0x30;

            *res++|=*cptr>>4;

            *res++=(*cptr&0x0f)<<2;

            *res++='=';

        }

    }

 

    *res='=';                                               /*保證最後結位為=結束原因是因為base64裏有為0的編碼*/

    for(res=*rptr;*res!='=';res++)

        *res="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[*res];

    

    rptr[0][strlen(*rptr)-1]='\0';                 /*去掉最後一個=*/

 

    return *rptr;

 

}

 

////////////////////////////////////////////////////////

 

//main.c

#include "base64.h"

 

int main(void)

{

    char *src="lubita asd";

    char *buf;

    char *dec_buf;

    

    base64_encode(src,&buf);

    printf("base64 encode:%s\n",buf);

    

    base64_decode(buf,&dec_buf);

    printf("base64 decode:%s\n",dec_buf);

 

    free(buf);

    free(dec_buf);

    return 0;

}

 



完整程式碼(包含makefile)http://filemarkets.com/file/jashliao/0b547af8/


參考資料:http://hi.baidu.com/wangpeng1314/item/c348450ff53bc16ed55a11ac


 


沒有留言:

張貼留言