C版的base64编码解码函数

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

Leave a comment

Your email address will not be published. Required fields are marked *