前两天发了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
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
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
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);
}