用位域进行base64 的解码;

来源:互联网 发布:网络接入控制 编辑:程序博客网 时间:2024/05/22 15:14


 

#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;
}
 

 

 

0 0