[Linux C]-BASE64編/解碼

[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

 

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *