前两天发了java版的,现在把c的代码也帖出来,这个是用到我的websocket server工程中的代码。
base64.h
/** Base64编码解码函数 @auhtor Hoverlees http://www.hoverlees.com */ #ifndef _BASE64_H #define _BASE64_H /** * base64编码 * @param input 需要编码的内容 * @param inputLen 需要编码的内容的长度 * @param output 编码后的内容将存到该指针指向的内存,请确保内存有 inputLen*4/3的字节数 * @return 编码后的字节长度 */ int base64_encode(const char* input,int inputLen,char* output); /** * base64解码 * @param input 需要解码的内容 * @param inputLen 需要解码的内容的长度 * @param output 解码后的内容将存到该指针指向的内存,请确保内存有 inputLen*3/4的字节数 * @return 解码后的字节长度 */ int base64_decode(const char* input,int inputLen,char* output); #endif
base64.c
#include "base64.h" static const char* base64Table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char base64TableMap[]={\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,\ 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,\ -1,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,-1,-1,-1,-1,-1,-1,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,51,-1,-1,-1,-1,-1,-1,-1,-1,\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; int base64_encode(const char* input,int inputLen,char* output){ int i,n,state,pos; n=state=pos=0; for(i=0;i<inputLen;i++){ switch(pos){ case 0: state=(input[i]&0xFC)>>2; output[n++]=base64Table[state]; state=(input[i]&0x3)<<4; pos=1; break; case 1: state|=((input[i]&0xF0)>>4); output[n++]=base64Table[state]; state=(input[i]&0xF)<<2; pos=2; break; case 2: state|=((input[i]&0xC0)>>6); output[n++]=base64Table[state]; state=input[i]&0x3F; output[n++]=base64Table[state]; pos=0; break; } } if(pos==1){ output[n++]=base64Table[state]; output[n++]='='; output[n++]='='; } else if(pos==2){ output[n++]=base64Table[state]; output[n++]='='; } return n; } int base64_decode(const char* input,int inputLen,char* output){ int pos,i,n; char cch,t; n=pos=0; for(i=0;i<inputLen;i++){ cch=input[i]; t=base64TableMap[cch]; if(cch=='=') break; switch(pos){ case 0: output[n]=(t<<2)&0xff; pos=1; break; case 1: output[n]=(output[n]|((t&0x30)>>4))&0xff; n++; output[n]=((t&0xf)<<4)&0xff; pos=2; break; case 2: output[n]=(output[n]|((t&0x3c)>>2))&0xff; n++; output[n]=((t&0x3)<<6)&0xff; pos=3; break; case 3: output[n]=(output[n]|t)&0xff; n++; pos=0; break; } } return n; }
测试代码
#include "base64.h" #include <string.h> void main(int argc,char* argv[]){ char buffer1[1024]; char buffer2[1024]; int n; const char* s="Hello Hoverlees!"; n=base64_encode(s,strlen(s),buffer1); buffer1[n]=0; printf("[%d] %s\n",n,buffer1); n=base64_decode(buffer1,n,buffer2); buffer2[n]=0; printf("[%d] %s\n",n,buffer2); }