[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; /*取ptr高6位放入res低6位*/ *res=*cptr++ << 4 & 0x30; /*移動ptr最低2位到高6位然後清0其它位*/ *res++|=*cptr >> 4; /*取ptr高4位給res低4位*/ *res=( *cptr++ & 0x0f ) << 2; /*取ptr低4位移動到高6位*/ *res++|=*cptr>>6; /*取ptr高2位給res低2位*/ *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
沒有留言:
張貼留言