base64 编码解码c语言实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

unsigned char base64_table[64]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

int codeNumber(unsigned char ch)
{
    int num;
    switch (ch) 
    {
        case 'A':num = 0;break;
        case 'B':num = 1;break;
        case 'C':num = 2;break;
        case 'D':num = 3;break;
        case 'E':num = 4;break;
        case 'F':num = 5;break;
        case 'G':num = 6;break;
        case 'H':num = 7;break;
        case 'I':num = 8;break;
        case 'J':num = 9;break;
        case 'K':num = 10;break;
        case 'L':num = 11;break;
        case 'M':num = 12;break;
        case 'N':num = 13;break;
        case 'O':num = 14;break;
        case 'P':num = 15;break;
        case 'Q':num = 16;break;
        case 'R':num = 17;break;
        case 'S':num = 18;break;
        case 'T':num = 19;break;
        case 'U':num = 20;break;
        case 'V':num = 21;break;
        case 'W':num = 22;break;
        case 'X':num = 23;break;
        case 'Y':num = 24;break;
        case 'Z':num = 25;break;
 
        case 'a':num = 26;break;
        case 'b':num = 27;break;
        case 'c':num = 28;break;
        case 'd':num = 29;break;
        case 'e':num = 30;break;
        case 'f':num = 31;break;
        case 'g':num = 32;break;
        case 'h':num = 33;break;
        case 'i':num = 34;break;
        case 'j':num = 35;break;
        case 'k':num = 36;break;
        case 'l':num = 37;break;
        case 'm':num = 38;break;
        case 'n':num = 39;break;
        case 'o':num = 40;break;
        case 'p':num = 41;break;
        case 'q':num = 42;break;
        case 'r':num = 43;break;
        case 's':num = 44;break;
        case 't':num = 45;break;
        case 'u':num = 46;break;
        case 'v':num = 47;break;
        case 'w':num = 48;break;
        case 'x':num = 49;break;
        case 'y':num = 50;break;
        case 'z':num = 51;break;
 
        case '0':num = 52;break;
        case '1':num = 53;break;
        case '2':num = 54;break;
        case '3':num = 55;break;
        case '4':num = 56;break;
        case '5':num = 57;break;
        case '6':num = 58;break;
        case '7':num = 59;break;
        case '8':num = 60;break;
        case '9':num = 61;break;

        case '+':num = 62;break;
        case '/':num = 63;break;
        case '=':num = 0;break;
 
        default:num=-1; // 非有效输入
    }
    return num;
}
unsigned char *base64_decode(const unsigned char *str)
{
        unsigned char *ptr=NULL;
        unsigned char *decodeBuf;
		int i=0;
        int len,memsize;
        u_int32_t comb=0;
        len=strlen(str);
        memsize=len/4*3+1;
        decodeBuf=(unsigned char *)malloc(memsize);
        if(decodeBuf==NULL)return NULL;
        ptr=decodeBuf;
        if(len%4==0)
        {
            for(i=0;i<len;i+=4)
            {
                comb=(codeNumber(str[i])<<18)+(codeNumber(str[i+1])<<12)+(codeNumber(str[i+2])<<6)+(codeNumber(str[i+3]));
                *(ptr+2)=comb&0xff;
                *(ptr+1)=(comb>>8)&0xff;
                *ptr=(comb>>16)&0xff;
                comb=0;
                ptr+=3;
            }
            *ptr='\0';
            return decodeBuf;
        }
        else return NULL;
}

unsigned char *base64_encode(const unsigned char *str)
{
        unsigned char *ptr=NULL;
        unsigned char *encodeBuf;
		int i=0;
        int len,memsize;
        u_int32_t comb=0;
        len=strlen(str);
        memsize=len/3*4+6;
        encodeBuf=(unsigned char *)malloc(memsize);
        if(encodeBuf==NULL)return NULL;        
        ptr=encodeBuf;
        for(i=0;(i+2)<len;i+=3)//(i+2)<len 用于处理小于3个字符的情况
        {
         comb=(str[i]<<16)+(str[i+1]<<8)+(str[i+2]);
         *(ptr+3)=base64_table[comb&0x3f];
         *(ptr+2)=base64_table[(comb>>6)&0x3f];
         *(ptr+1)=base64_table[(comb>>12)&0x3f];
         *ptr=base64_table[(comb>>18)&0x3f];
		 ptr+=4;
         comb=0;
        }
        if(len%3==1)//剩余1个字符
        {	
            comb=str[i]<<4;
            *(ptr+3)='=';
            *(ptr+2)='=';
            *(ptr+1)=base64_table[comb&0x3f];
            *ptr=base64_table[(comb>>6)&0x3f];
			comb=0;
			ptr+=4;
        }
        else if(len%3==2)//剩余2个字符
        {
			comb=str[i]<<10;
			comb|=str[i+1]<<2;
			*(ptr+3)='=';
            *(ptr+2)=base64_table[comb&0x3f];
            *(ptr+1)=base64_table[(comb>>6)&0x3f];
            *ptr=base64_table[(comb>>12)&0x3f];
			comb=0;
			ptr+=4;
        }
		*ptr='\0';
        return encodeBuf;
}
int main()
{
	unsigned char *src="hello,world;你好,世界";
	unsigned char *decodebuf;
	unsigned char *encodebuf;
	printf("original buf:%s\n",src);
	encodebuf=base64_encode(src);
	printf("base64 encode:%s\n",encodebuf);
	decodebuf=base64_decode(encodebuf);
    printf("base64 decode:%s\n",decodebuf);
	free(encodebuf);
	free(decodebuf);
   
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值