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);
}
输出结果如下: