概述
代码
config.h
#ifndef BASE64_CONFIG_H
#define BASE64_CONFIG_H
//----------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <malloc.h>
char base64_table[] = {
'A','B','C','D','E','F','G','H','I','J',
'K','L','M','N','O','P','Q','R','S','T',
'U','V','W','X','Y','Z','a','b','c','d',
'e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v','w','x',
'y','z','0','1','2','3','4','5','6','7',
'8','9','+', '/', '\0'
};
//----------------------------------------------
#endif //BASE64_CONFIG_H
main.c
#include "config.h"
#include <windows.h>
void drawMenu();
void base64_map(uint8_t *in_block, int length);
void base64_unmap(char *in_block);
void base64_encode(char *in_block,int length,uint8_t *out_block);
void base64_decode(char *in_block,int length,uint8_t *out_block);
int main() {
while(1)
{
drawMenu();
char c=(char)getchar();
getchar();//吸收回车
system("cls");
if(c=='3')
{
exit(0);
}
else if(c=='1')
{
printf("----base64加密----\n");
char text[1024];
gets(text);
uint8_t * result=(uint8_t*)malloc(sizeof(uint8_t)*1024);
memset(result,0, sizeof(uint8_t)*1024);
base64_encode(text,(int)strlen(text),result);
int length = (int)((strlen(text)*4-1)/3+1);
length=length%4==3?length+1:length+2;
int i=0;
while(i<length)
{
printf("%c",result[i]);
++i;
}
printf("\n");
break;
}
else if(c=='2')
{
printf("----base64解密----\n");
char text[1024];
gets(text);
uint8_t * result=(uint8_t*)malloc(sizeof(uint8_t)*1024);
memset(result,0, sizeof(uint8_t)*1024);
base64_decode(text,(int)strlen(text),result);
int length=(int)strlen(text);
int n=length;
while(text[--n]=='=');
if(n==length-2)
{
length=(length>>2)*3-1;
}
else if(n==length-3)
{
length=(length>>2)*3-2;
}
else if(n==length-1)
{
length=(length>>2)*3;
}
for(int i=0;i<length;++i)
{
printf("%c",result[i]);
}
printf("\n");
break;
}
}
printf("----输入q退出程序----\n");
char c=(char)getchar();
while(1)
{
if(c=='q')
{
break;
}
else
{
c=(char)getchar();
}
}
return 0;
}
void drawMenu()
{
printf("***************\n");
printf("*1、base64加密\n");
printf("*2、base64解密\n");
printf("*3、退出程序\n");
printf("***************\n");
}
void base64_encode(char *in_block,int length,uint8_t *out_block)
{
uint8_t *temp=out_block;
char t[3];
int i=0;
while(i<length)
{
memset(t,0,3);
memcpy(t,in_block,i+3<length?3:length-i);
memset(out_block,0,4);
out_block[0]=(t[0]>>2)&0x3f;
out_block[1]=((t[0]<<4)&0x30)|((t[1]>>4)&0x0f);
out_block[2]=((t[1]<<2)&0x3c)|((t[2]>>6)&0x03);
out_block[3]=(t[2])&0x3f;
out_block += 4;
in_block +=3;
i+=3;
}
base64_map(temp,(length*4-1)/3+1);
}
void base64_map(uint8_t *in_block, int length)
{
int i=0;
while(i<length)
{
in_block[i]=base64_table[in_block[i]];
++i;
}
if(length%4==3)
{
in_block[length]='=';
}
else if(length%4==2)
{
in_block[length]=in_block[length+1]='=';
}
}
void base64_decode(char *in_block,int length,uint8_t *out_block)
{
char t[4];
int i=0;
while(i<length)
{
if(*in_block=='=')
{
return;
}
memcpy(t,in_block,4);
memset(out_block,0,3);
base64_unmap(t);
out_block[0]=((t[0]<<2)&0xfc)|((t[1]>>4)&3);
out_block[1]=((t[1]<<4)&0xf0)|((t[2]>>2)&0xf);
out_block[2]=((t[2]<<6)&0xc0)|(t[3]&0x3f);
out_block+=3;
in_block+=4;
i+=4;
}
}
void base64_unmap(char *in_block)
{
char *c;
for(int i=0;i<4;++i)
{
c=in_block+i;
if(*c>='A'&&*c<='Z')
{
*c-='A';
continue;
}
if(*c>='a'&&*c<='z')
{
*c-='a';
*c+=26;
continue;
}
if(*c=='+')
{
*c=62;
continue;
}
if(*c=='/')
{
*c=63;
continue;
}
if(*c=='=')
{
*c=0;
continue;
}
*c-='0';
*c+=52;
}
}