赞
踩
Base64字符包括 A-Z a-z 0-9 + / 共计64个字符,对应0-63
将原始字符串按6bit拆分,前面补两个0组成一个新的字节
最后一位不满8位补0 ,在末尾用=标记补了几个0,补两个0加一个= ,补四个0加俩=
C语言实现如下:
- #include "stdio.h"
- #include "string.h"
- #include "stdlib.h"
-
- char* base64_decode(const char* str){
- unsigned char imap[79]={62,0,0,0,63,52,53,54,55,56,57,58,59,60,61,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50};
- int rest_count =0;
- int buf_idx=0;
- int len = strlen(str);
- int flen = len;
- while(str[flen-1]=='=')
- flen--;
- int buflen = flen*6/8+1;
- unsigned char* buf = (unsigned char*) malloc(buflen);
- memset(buf,'\0',buflen);
- for(int i=0;i<flen;i++){
- unsigned char c=imap[str[i]-43];
- int mcount = rest_count ==0?-2:6-rest_count;
- unsigned char c0 = (mcount>0?c>>mcount:c<<-mcount);
- buf[buf_idx] = buf[buf_idx] | c0;
- rest_count= mcount <0 ? -mcount : 8-mcount;
- if(mcount>=0)
- buf[++buf_idx]=c<<rest_count;
- }
- return buf;
- }
-
- char* base64_encode(const char* str){
- char map[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- int len =strlen(str);
- int buflen = len * 8 / 6 + 4;//缺位补齐1 俩等号2 最后0-1位
- unsigned char* buf = (unsigned char*)malloc(buflen);
- memset(buf,'\0',buflen);
- char a [4];
- int rest_count = 0;
- int index = 0;
- int buf_idx =0 ;
- unsigned char last = 0;
- for(int i=0;i<len;i++){
- unsigned char c = str[i];
- a[index]= (last<<(6-rest_count))&63;
- int get_count = 6-rest_count;
- a[index] = a[index] | ( c >>(8-get_count));
- a[index]=map[a[index]];
- rest_count = 8-get_count;
- last = c;
- index = index==2?0:index+1;
- if(index==0){
- a[3]=map[c&63];
- memcpy(buf+buf_idx,a,4);
- buf_idx+=4;
- rest_count=0;
- last = 0;
- }
- }
- if(index!=0){
- a[index]= last<<(6-rest_count) & 63;
- a[index]=map[a[index]];
- memcpy(buf+buf_idx,a,index+1);
- buf[buf_idx+index+1]='=';
- buf[buf_idx+index+2]= rest_count ==2 ? '=':0;
- }
- return buf;
- }
- int main()
- {
- char* c = base64_encode("abcdefgh");
- printf("decode:%s\n",c);
- char* d = base64_decode(c);
- printf("encode:%s\n",d);
- free(c);
- free(d);
- }
输出结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。