C base64 编码文件

功能:读取二进制文件,转化为BASE64编码字符串,文件会增大1/3,详见BASE64编码原理,这样就可以在帖子中保存文件了,没办法,公司不许上传附件,POST也只能一次6KB,之前还写了一个模拟HTTP发送的程序(http://www.cnblogs.com/yangyh/archive/2010/07/21/1781845.html),实为CNBLOG的小组自动提交程序,不过现在CNBLOG添加了防ROBOT功能了,一次只能发32帖了

 

#include "stdafx.h"

#include "stdio.h"

#include "string.h"

#include "stdlib.h"

#define  MAXLEN 1024

#include <iostream>

using namespace std;

long int encode(  char *src,long int src_len, char *dst);

long int decode(char *src, long int src_len, char *dst);

long int getFileLength(const char *filePath)

{

	FILE *fp;

	fp = fopen(filePath, "rb");

	if (!fp) {

		printf("Could not load  file '%s'.  Exiting.\n", filePath);

		exit(1);

	}

	fseek(fp, 0, SEEK_END);

	long int ret =  ftell(fp);

	fclose(fp);

	return ret;

}

long int getFileStr(const char *filePath, char*);

long int getFileStr(const char *filePath, char * back) {

	FILE *fp;

	

	int result;

	

	string buff;

	char temp;

	fp = fopen(filePath, "rb");

	

	if (!fp) {

		printf("Could not load  file '%s'.  Exiting.\n", filePath);

		exit(1);

	}

	fseek(fp, 0, SEEK_END);

	long int fileLength = ftell(fp);

	fseek(fp, 0, SEEK_SET);

	

	printf("file size:%ld\n",fileLength);

	long int j = 0;

	while((result = fread(&temp, 1, 1, fp))==1){

		back[j++]=temp;

		//	printf("%d",temp);

		

	}

	if(j!=fileLength){

		printf("read file error");

		exit(-1);

	}

	back[j]=0;

	

	fclose(fp);

	//printf("length:%d\n",strlen(back));

	return fileLength;

}

void Fill0(char t[])

{

    

    if(strlen(t)<2)

    {

        t[1]=t[0];

        t[0]='0';

        t[2]=0;

    }

}

int   binaryToString(char *from,char *to)   

{   

	

	FILE *out;

	char *dest;

	long int len = getFileLength(from);

	

	out=fopen(to,"wb");

	if(!out){

		printf("error write %s",to);

		exit(-1);

	}

	dest = new  char[len+1];

	

	if(!dest){

		printf("malloc error :%ld",len+1);

		exit(-1);

	}

	char * ret= new char[len*2];

	if(!ret){

		printf("malloc error :%ld",len*2);

		exit(-1);

	}

	getFileStr(from,dest);

	//printf("read:%ld\n",dest[1]);

	long int newlen =  encode(dest,len,ret);

	

	//  puts(ret);

	fwrite(ret,newlen,1,out);

	fclose(out);

	free(dest);

	free(ret);

	return   0;   

}  

long int encode( char *src,long int src_len, char *dst)



{

	

	long int i = 0, j = 0;

	//	printf("%ld\n",src[2]);

	

	char base64_map[65] = "BADCFEGHIJKLMNOPQRSTUVWXYZbadcfeghijklmnopqrstuvwxyz0123456789+/";

	

	for (; i < src_len - src_len % 3; i += 3) {

		//printf("%ld\n",(unsigned char)src[i]);

		//getchar();

		

		dst[j++] = base64_map[(src[i] >> 2) & 0x3F];

		

		// 		

		dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];

		// 		

		dst[j++] = base64_map[((src[i + 1] << 2) & 0x3C) + ((src[i + 2] >> 6) & 0x3)];

		// 		

		dst[j++] = base64_map[src[i + 2] & 0x3F];

		//printf("%d",dst[j]);

	}

	

	

	

	if (src_len % 3 == 1) {

		

		dst[j++] = base64_map[(src[i] >> 2) & 0x3F];

		

		dst[j++] = base64_map[(src[i] << 4) & 0x30];

		

		dst[j++] = '=';

		

		dst[j++] = '=';

		

	}

	

	else if (src_len % 3 == 2) {

		

		dst[j++] = base64_map[(src[i] >> 2) & 0x3F];

		

		dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];

		

		dst[j++] = base64_map[(src[i + 1] << 2) & 0x3C];

		

		dst[j++] = '=';

		

	}

	

	

	

	dst[j] = '\0';

	//puts(dst);

	printf("newlength:%ld\n",j);

	return j;

	

} 

int stringToBinary(char *from,char *to)

{

	FILE *out;

	char *dest;

	long int len = getFileLength(from);

	

	out=fopen(to,"wb");

	if(!out){printf("error write %s",to);

	exit(-1);

	}

	dest = new  char[len+1];

	

	if(!dest){

		printf("malloc error :%ld",len+1);

		exit(-1);

	}

	char * ret= new char[len*2];

	if(!ret){

		printf("malloc error :%ld",len*2);

		exit(-1);

	}

	getFileStr(from,dest);

	//printf("read:%ld\n",dest[1]);

	long int newlen =  decode(dest,len,ret);

	

	//  puts(ret);

	fwrite(ret,newlen-1,1,out);

	fclose(out);

	free(dest);

	free(ret);

	return   0;   

}





void main(int argc,char* argv[])

{

    //binaryToString("D:\\Users\\Administrator\\Documents\\VC6 WorkSpace\\base64\\Debug\\2.txt","D:\\Users\\Administrator\\Documents\\VC6 WorkSpace\\base64\\Debug\\2.rar");

	//stringToBinary("D:\\Users\\Administrator\\Documents\\VC6 WorkSpace\\base64\\Debug\\2.rar","D:\\Users\\Administrator\\Documents\\VC6 WorkSpace\\base64\\Debug\\2.1.txt");

	//printf("%d",'a');    

	if(argc!=4)

	{

		printf("cmd -tos|tob <srcFile> <destFile>\n");

		getchar();

		return ;

	}

	if(strcmp(argv[1],"tos")==0)

	{

		binaryToString(argv[2],argv[3]);

	}

	else if(strcmp(argv[1],"tob")==0)

	{

		stringToBinary(argv[2],argv[3]);

	}

	

}

long int decode(char *src, long int src_len, char *dst)



{

	

	long	int i = 0, j = 0;

	

	unsigned char base64_decode_map[256] = {

		

		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

			

			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

			

			255, 255, 255, 62, 255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,

			

			255, 0, 255, 255, 255, 1, 0, 3, 2, 5, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14,

			

			15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, 255, 27, 26, 29,

			

			28, 31, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,

			

			49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

			

			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

			

			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

			

			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

			

			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

			

			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

			

			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};

		

		

		

        for (; i < src_len; i += 4) {

			

			dst[j++] = base64_decode_map[src[i]] << 2 |

				

				base64_decode_map[src[i + 1]] >> 4;

			

			dst[j++] = base64_decode_map[src[i + 1]] << 4 |

				

				base64_decode_map[src[i + 2]] >> 2;

			

			dst[j++] = base64_decode_map[src[i + 2]] << 6 |

				

				base64_decode_map[src[i + 3]];

			

        }

		

		

		

        dst[j] = '\0';

		printf("decode length :%ld\n",j);

		return j;

		

}

你可能感兴趣的:(base64)