BASE64解码的c语言实现

来源:互联网 发布:淘宝助理关联电子面单 编辑:程序博客网 时间:2024/06/03 11:36

近来因项目需要,写了一个base64解码的程序,用的是c语言,本人非c语言高手,写得比较粗糙,里面有些问题,希望其他学习者多指教

1.这个程序里,在外面定义了一个全局变量,这个地方有待考虑

2.base64解码最难点是在于待解码的文件的最后几个字符的解码

 

 

 

#include "iostream.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

unsigned char result_char[3] ;

char index_table[123]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,  //BASE64解析索引表;
                                0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 
                       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,  
                       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,               0xFF,0xFF,0xFF,0x3E,0xFF,0xFF,0xFF,0x3F,0x34,0x35,
        0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0xFF,0xFF, 
        0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x01,0x02,0x03,0x04,
        0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,
        0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
        0x19,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1A,0x1B,0x1C,
        0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,
        0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,
        0x31,0x32,0x33};

 


FILE * file_initial(char file_name[],char state[])
{
 FILE *fp;
 if ((fp = fopen(file_name,state)) ==NULL)
 {
  printf("cannot open the file!/n");
  exit(0);
 }
 else
  printf("the file is opened!/n");
 return fp;
};

 

int file_bytelength(FILE *fp)                                                               //计算文件有效字节长度;
{
 char ch;
 long  begin,end,file_length,nuch_length = 0;
 int i = 0;
 begin = ftell(fp);
 if (begin == -1L)
 printf("error/n");
 while (!feof(fp))
 {
  ch = fgetc(fp);
  if ((ch == 0x0A) || (ch == 0x0D) || (ch == 0x20))
  nuch_length++;
 }
 printf("%d/n",nuch_length);
 end = ftell(fp);
 if (end == -1L)
 printf("error/n");
 file_length = end - begin - nuch_length;
 file_length = (int)file_length;
 rewind(fp);
 return file_length;
};

 

void process(unsigned char int_array[],int k)                                                           //解码过程;
{

   unsigned char first_char,second_char,third_char,
   forth_char,middle_char;
   first_char = int_array[0]<<2;
   second_char = int_array[1]>>4;
   middle_char = first_char | second_char;
   result_char[0] = middle_char;
  if (k >= 3)
  {
   second_char = int_array[1]<<4;
   third_char = int_array[2]>>2;
   middle_char = second_char | third_char;
   result_char[1] = middle_char;
   if (k == 4)
   {
   third_char = int_array[2]<<6;
   forth_char = int_array[3];
   middle_char = third_char | forth_char;
   result_char[2] = middle_char; 
   }
  }    
};

 

  
void decoding(FILE * fp,int file_size,char index_tble[],char file_name[])                   //BASE64解码;
{
 unsigned char int_array[4],get_char,
  first_char,second_char,third_char,forth_char,middle_char;
 char state[] = {"wb"};
 FILE *fpout = file_initial(file_name,state);
 int i = 0;
    while (!feof(fp))
    {
  get_char = fgetc(fp);
 printf("%c",get_char);
 if((get_char != 0x0A) && (get_char != 0x0D) && (get_char != 0x20))
  {
    int_array[i]= index_tble[get_char];
    i++;
    
    if(!(i % 4))
    {
     if (int_array[i-1] != 0xFF)
     {
      process(int_array,4);
      for (int j = 0;j<3;j++)
      {
       // printf("%c",result_char[j]);
       fputc(result_char[j],fpout);
      }
      
      i = 0;
     }
     else
     {
      if (int_array[i-2] != 0xFF)
      {
       process(int_array,3);
       for (int j = 0;j<2;j++)
       {
        fputc(result_char[j],fpout);
       } 
       
      }
      else
      {
       process(int_array,2);
       fputc(result_char[0],fpout);
       
      }
     }
   }
  }
 
 }
 fclose(fpout);
 fclose(fp);

};

 

void main()
{
  FILE *fpin,*tmpfile,*fpout;
  int file_size;
  char file1_name[]="centificate.txt";
  char state[] = {"r"};
  fpin = file_initial(file1_name,"r");
  char file2_name[] = "changeout.txt";
 file_size = file_bytelength(fpin);
  printf("%d/n",file_size);
 decoding(fpin,file_size,index_table,file2_name);

}

原创粉丝点击