zoukankan      html  css  js  c++  java
  • 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;
    		
    }
    
  • 相关阅读:
    关于binary log一点总结[转]
    使用mysql索引技巧及注意事项
    优化php性能的一点总结
    html静态页面实现微信分享思路
    MySql字符串函数使用技巧
    Oracle计算时间差函数
    oracle10g获取Date类型字段无时分秒解决办法!
    Oracle常用函数
    COALESCE操作符
    关于null的操作
  • 原文地址:https://www.cnblogs.com/yangyh/p/1939666.html
Copyright © 2011-2022 走看看