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);
}
- base64编码解码的实现(C语言)
- base64编码解码的实现(C语言)
- Base64编码解码的实现(C语言)
- BASE64解码的c语言实现
- Base64编码解码的实现(C语言)
- base64编码、解码的C语言实现
- Base64 编解码的C语言实现
- Base64编解码的C语言实现
- base64编码、解码的C语言实现
- base64编码、解码的C语言实现
- base64编码、解码的C语言实现
- BASE64编码、解码的C语言实现
- 用C语言实现的Base64编码&amp;解码
- base64编码/解码的实现(C语言)
- openssl 中base64编解码的c语言实现
- Base64 编解码C语言实现
- Base64编码解码c语言实现
- Base64编码解码C语言实现
- MFC文件读写技巧
- ORACLE时间相减
- FLEX +SSH实践
- MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT宏
- ie6中网页不能复制
- BASE64解码的c语言实现
- MFC中的文件读写操作
- Doproject 汉化
- 新论坛被百度收录的过程总结
- Doproject 汉化
- C#异常处理
- 浮点数
- 屏蔽一切js错误的技巧
- pku 2337 Catenyms