功能:读取二进制文件,转化为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;
}