1.源码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
unsigned char *base64_encode(unsigned char *str, long str_len);
unsigned char *base64_decode(unsigned char *code, long *str_len);
unsigned char *base64_encode(unsigned char *str, long str_len)
{
long len;
unsigned char *res;
int i,j;
unsigned char *base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/*计算经过base64编码后的字符串长度*/
if(str_len % 3 == 0)
{
len = str_len / 3 * 4;
}
else
{
len = (str_len / 3 + 1) * 4;
}
res = malloc(sizeof(unsigned char)*len+1);
res[len] = '\0';
/*以3个8位字符为一组进行编码*/
for(i=0,j=0;i<len-2;j+=3,i+=4)
{
res[i]=base64_table[str[j]>>2];
res[i+1]=base64_table[(str[j]&0x3)<<4 | (str[j+1]>>4)];
res[i+2]=base64_table[(str[j+1]&0xf)<<2 | (str[j+2]>>6)];
res[i+3]=base64_table[str[j+2]&0x3f];
}
switch(str_len % 3)
{
case 1:
res[i-2]='=';
res[i-1]='=';
break;
case 2:
res[i-1]='=';
break;
}
return res;
}
unsigned char *base64_decode(unsigned char *code, long *str_len2)
{
/*根据base64表,以字符找到对应的十进制数据*/
int table[]={0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,62,0,0,0,
63,52,53,54,55,56,57,58,
59,60,61,0,0,0,0,0,0,0,0,
1,2,3,4,5,6,7,8,9,10,11,12,
13,14,15,16,17,18,19,20,21,
22,23,24,25,0,0,0,0,0,0,26,
27,28,29,30,31,32,33,34,35,
36,37,38,39,40,41,42,43,44,
45,46,47,48,49,50,51
};
long len;
long str_len;
unsigned char *res;
int i,j;
/*计算解码后的字符串长度*/
len=strlen(code);
/*判断编码后的字符串后是否有*/
if(strstr(code,"=="))
str_len=len/4*3-2;
else if(strstr(code,"="))
str_len=len/4*3-1;
else
str_len=len/4*3;
res=malloc(sizeof(unsigned char)*str_len+1);
res[str_len]='\0';
/*以4个字符为一位进行解码*/
for(i=0,j=0;i < len-2;j+=3,i+=4)
{
res[j]=((unsigned char)table[code[i]])<<2 | (((unsigned char)table[code[i+1]])>>4);
res[j+1]=(((unsigned char)table[code[i+1]])<<4) | (((unsigned char)table[code[i+2]])>>2);
res[j+2]=(((unsigned char)table[code[i+2]])<<6) | ((unsigned char)table[code[i+3]]);
}
*str_len2 = str_len;
return res;
}
int main(int argc, char **argv)
{
int type = -1;
int ch;
char *file[2] = {NULL, NULL};
char *out = NULL;
long w = 0;
long v = 0;
if(argc != 3 && argc != 4)
{
return -1;
}
type = 1;
file[0] = argv[1];
file[1] = argv[2];
if(argc == 4)
{
if(strcmp(argv[1], "-d") != 0)
{
return -1;
}
type = 2;
file[0] = argv[2];
file[1] = argv[3];
}
FILE *rfp = NULL;
FILE *wfp = NULL;
unsigned char buf[4*1024*1024];
rfp = fopen(file[0], "r");
if(rfp == NULL)
{
return -1;
}
buf[0] = 0x00;
while(!feof(rfp))
{
ch = fgetc(rfp);
if(ch != EOF)
{
buf[w++] = ch;
}
}
buf[w] = 0x00;
fclose(rfp);
if(type == 1)
{
out = base64_encode(buf, w);
v = strlen(out);
}
else if(type == 2)
{
if(w - 1 >= 0)
{
if(isspace(buf[w-1]))
{
buf[w-1] = 0x00;
w--;
}
}
if(w - 1 >= 0)
{
if(isspace(buf[w-1]))
{
buf[w-1] = 0x00;
w--;
}
}
out = base64_decode(buf, &v);
}
wfp = fopen(file[1], "w");
if(wfp == NULL)
{
free(out);
return -1;
}
fwrite(out, 1, v, wfp);
fclose(wfp);
free(out);
return 0;
}
2.编译源码
$ gcc -o base64 base64.c -std=c89
3.编码及解码
$ ./base64 1.txt 2.txt
$ ./base64 -d 2.txt 3.txt
网友评论