#include<stdio.h>
#include<string.h>
#define OK 1
#define ERROR_INPUT 0
struct fun
{
unsigned char a:6;
unsigned char b:2;
unsigned char c:4;
unsigned char d:4;
unsigned char e:2;
unsigned char f:6;
};
//建立一个联合体
union
{
struct fun on;
char A[3];
}un;
char *MTABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
//建立一个表
/*
* Function : base64Dncode
* description : base64解码;
* param in : src待解码字符串
* param ou : dst 解码够的字符串
* return : OK 正常运行
* : ERROR_INPUT 输入错误;
*
* */ //
int base64Dncode(char *dst,const char *src)
{
if(!dst||!src||*src=='\0')
return ERROR_INPUT;
int i = 0;
int t = 0;
char n = 0;
int stlen = strlen(src);
int count = (stlen) / 4;
char a[4] = {0};
for(i = 0; i < count; i++)
{
for(t= 0; t < 4;t++)
{
n = 0;
while(1) //找出字符对应表上的位置;
{
if( *(src+t) == MTABLE[n] )
{
break;
}
if( *(src + t) == '=')
{
n = '\0';
break;
}
n++;
}
a[t]= n;
}
un.on.f = a[0]; //将位置数值 一一赋值给联合体;
un.on.e = a[1]>>4;
un.on.d = a[1]&0x0f;
un.on.c = a[2]>>2;
un.on.b = a[2]&0x3;
un.on.a = a[3];
*dst = un.A[2]; //从联合体中 取出 解码后的数值 赋值给dst;
*(dst + 1) = un.A[1];
*(dst + 2) = un.A[0];
dst += 3;
src += 4;
}
return OK;
}
int main()
{
int ret;
char src[1024] = {0};
char dst[1024] = {0};
scanf("%s",src);
ret = base64Dncode(dst , src);
if(ret == OK)
{
printf("%s\n",dst);
}
else
printf("ERROR %d\n",ret);
return 0;
}