#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;
}
base64 编码解码c语言实现
于 2025-01-04 17:29:43 首次发布