C 语言 实现 Base64 编码

发布时间:2026/11/2 6:08:40
C 语言 实现 Base64 编码

C 语言 实现 Base64 编码



百度百科,什么是Base64编码



#include<stdio.h>#include<stdlib.h>structBase64Code{unsignedchar*data;unsignedlonglongintsize;};intmain(intargc,char*argv[]);structBase64CodeBase64Encode(unsignedchar*data,unsignedlonglongintsize);structBase64CodeBase64Decode(unsignedchar*data,unsignedlonglongintsize);intmain(intargc,char*argv[]){structBase64Codea=Base64Encode((unsignedchar*)"0123456789",10);printf("%d\t %s \n",a.size,a.data);structBase64Codeb=Base64Decode((unsignedchar*)a.data,a.size);printf("%d\t %s \n",b.size,b.data);a=Base64Encode((unsignedchar*)"98643210",10);printf("%d\t %s \n",a.size,a.data);b=Base64Decode((unsignedchar*)a.data,a.size);printf("%d\t %s \n",b.size,b.data);a=Base64Encode((unsignedchar*)"1234",4);printf("%d\t %s \n",a.size,a.data);b=Base64Decode((unsignedchar*)a.data,a.size);printf("%d\t %s \n",b.size,b.data);return0;}structBase64CodeBase64Encode(unsignedchar*data,unsignedlonglongintsize){structBase64CodeReturnData;ReturnData.size=0;ReturnData.data=NULL;if(data==NULL||size==0){returnReturnData;}ReturnData.data=(unsignedchar*)malloc((size%3==0)?(size*8/6+1):(4-(size%3)+size*8/6+1));if(ReturnData.data==NULL){returnReturnData;}ReturnData.data[(size%3==0)?(size*8/6):(4-(size%3)+size*8/6)]=0;ReturnData.size=size-(size%3);charBase64Data[64];unsignedlonglonginttemp;unsignedlonglonginti=0;unsignedlonglongintj=0;Base64Data[62]='+';Base64Data[63]='/';for(i=65;i<91;i++){Base64Data[j]=i;j++;}for(i=97;i<123;i++){Base64Data[j]=i;j++;}for(i=48;i<58;i++){Base64Data[j]=i;j++;}charBuffer[4];j=0;for(i=0;i<size;i=i+3){Buffer[0]=Base64Data[data[i]>>2];Buffer[1]=(((unsignedchar)(data[i]<<6))>>2);if(i==ReturnData.size&&size-i==1){ReturnData.data[j]=Buffer[0];j++;ReturnData.data[j]=Base64Data[Buffer[1]];j++;ReturnData.data[j]='=';j++;ReturnData.data[j]='=';break;}Buffer[1]=Base64Data[Buffer[1]+(data[i+1]>>4)];Buffer[2]=(((unsignedchar)(data[i+1]<<4))>>2);if(i==ReturnData.size&&size-i==2){ReturnData.data[j]=Buffer[0];j++;ReturnData.data[j]=Buffer[1];j++;ReturnData.data[j]=Base64Data[Buffer[2]];j++;ReturnData.data[j]='=';break;}Buffer[2]=Base64Data[Buffer[2]+(data[i+2]>>6)];Buffer[3]=Base64Data[(((unsignedchar)(data[i+2]<<2))>>2)];for(temp=j;temp<j+4;temp++){ReturnData.data[temp]=Buffer[temp-j];}j=temp;}ReturnData.size=(size%3==0)?(size*8/6):(4-(size%3)+size*8/6);returnReturnData;}structBase64CodeBase64Decode(unsignedchar*data,unsignedlonglongintsize){structBase64CodeReturnData;ReturnData.size=NULL;ReturnData.data=NULL;if(data==NULL||size==0||size%4!=0){returnReturnData;}ReturnData.data=(unsignedchar*)malloc(size*6/8+1);if(ReturnData.data==NULL){returnReturnData;}charBase64Data[64];unsignedlonglonginttemp=0;unsignedlonglonginti=0;for(temp=0;temp<size*6/8+1;temp++){ReturnData.data[temp]=0;}unsignedlonglongintj=0;Base64Data[62]='+';Base64Data[63]='/';for(i=65;i<91;i++){Base64Data[j]=i;j++;}for(i=97;i<123;i++){Base64Data[j]=i;j++;}for(i=48;i<58;i++){Base64Data[j]=i;j++;}for(i=0;i<size;i=i+4){if(i==size-4&&data[size-1]=='='&&data[size-2]=='='){for(j=0;j<64;j++){if(data[i]==Base64Data[j]){ReturnData.data[ReturnData.size]=((unsignedchar)(j<<2));}}for(j=0;j<64;j++){if(data[i+1]==Base64Data[j]){ReturnData.data[ReturnData.size]=ReturnData.data[ReturnData.size]+(j>>4);}}ReturnData.size=ReturnData.size+1;break;}elseif(i==size-4&&data[size-1]=='='&&data[size-2]!='='){for(j=0;j<64;j++){if(data[i]==Base64Data[j]){ReturnData.data[ReturnData.size]=((unsignedchar)(j<<2));ReturnData.size=ReturnData.size+1;}}for(j=0;j<64;j++){if(data[i+1]==Base64Data[j]){ReturnData.data[ReturnData.size-1]=ReturnData.data[ReturnData.size-1]+(j>>4);ReturnData.data[ReturnData.size]=(unsignedchar)(j<<4);ReturnData.size=ReturnData.size+1;}}for(j=0;j<64;j++){if(data[i+2]==Base64Data[j]){ReturnData.data[ReturnData.size-1]=ReturnData.data[ReturnData.size-1]+(j>>2);ReturnData.data[ReturnData.size]=(unsignedchar)(j<<6);}}break;}for(j=0;j<64;j++){if(data[i]==Base64Data[j]){ReturnData.data[ReturnData.size]=((unsignedchar)(j<<2));ReturnData.size=ReturnData.size+1;}}for(j=0;j<64;j++){if(data[i+1]==Base64Data[j]){ReturnData.data[ReturnData.size-1]=ReturnData.data[ReturnData.size-1]+(j>>4);ReturnData.data[ReturnData.size]=(unsignedchar)(j<<4);ReturnData.size=ReturnData.size+1;}}for(j=0;j<64;j++){if(data[i+2]==Base64Data[j]){ReturnData.data[ReturnData.size-1]=ReturnData.data[ReturnData.size-1]+(j>>2);ReturnData.data[ReturnData.size]=(unsignedchar)(j<<6);ReturnData.size=ReturnData.size+1;}}for(j=0;j<64;j++){if(data[i+3]==Base64Data[j]){ReturnData.data[ReturnData.size-1]=ReturnData.data[ReturnData.size-1]+j;}}}returnReturnData;}