专栏文章

base64

休闲·娱乐参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miquxp4k
此快照首次捕获于
2025/12/04 11:09
3 个月前
此快照最后确认于
2025/12/04 11:09
3 个月前
查看原文
CPP
#include<string>   //字符串
#include<iostream> //输入输出流
#include<windows.h>//windows
using namespace std;
const string base64char="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const unsigned char base64id[128]={
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,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,-1,-1,-1,-1,-1,-1,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,-1,-1,-1,-1,-1
};
string filenamenos(const string &path){
	string s;
	int t1=path.size()-1,t2;
	while(t1>0&&path[t1]!='.') t1--;
	t2=t1;
	while(t1>0&&path[t1]!='\\') t1--;
	for(int i=t1+1;i<t2;i++) s+=path[i];
	return s;
}
string filesuffix(const string &path){
	string s;int l=path.size();
	int id=l-1;
	while(id>0&&path[id]!='.') id--;
	for(int i=id;i<l;i++) s+=path[i];
	return s;
}
string filename(const string &path){
	string s;int l=path.size();
	int id=l-1;
	while(id>0&&path[id]!='\\') id--;
	for(int i=id+1;i<l;i++) s+=path[i];
	return s;
}
bool tobase64(const string &in){
	FILE* f=freopen(in.c_str(),"rb",stdin);
	if(f==NULL){
		cerr<<"源文件 "<<in<<" 不存在!!!";
		return false;
	}
	string fname;
	{
		int id=in.size()-1;
		while(id>0&&in[id]!='\\') id--;
		for(int i=0;i<=id;i++) fname+=in[i];
		fname=fname+"out.txt";
		freopen(fname.c_str(),"w",stdout);
	}
	cout<<"#File name:\n";
	cout<<'$'<<' '<<filename(in)<<'\n';
	cout<<"#File content:\n";
	string s;
	unsigned char b1,b2,b3;
	while(true){
		if(fread(&b1,sizeof(unsigned char),1,f)!=1) break;
		if(fread(&b2,sizeof(unsigned char),1,f)!=1){
			s+=base64char[(b1&0xFC)>>2];
			s+=base64char[(b1&0x03)<<4];
			s+="==";
			break;
		}
		if(fread(&b3,sizeof(unsigned char),1,f)!=1){
			s+=base64char[(b1&0xFC)>>2];
			s+=base64char[((b1&0x03)<<4)|((b2&0xF0)>>4)];
			s+=base64char[(b2&0x0F)<<2];
			s+='=';
			break;
		}
		s+=base64char[(b1&0xFC)>>2];
		s+=base64char[((b1&0x03)<<4)|((b2&0xF0)>>4)];
		s+=base64char[((b2&0x0F)<<2)|((b3&0xC0)>>6)];
		s+=base64char[b3&0x3F];
	}
	cout<<"$$\n"<<s;
	
	fclose(stdin);fclose(stdout);
	system(("start "+fname).c_str());
	return true;
}
bool tobin(const string &in){
	if(freopen(in.c_str(),"r",stdin)==NULL){
		cerr<<"源文件 "<<in<<" 不存在!!!";
		return false;
	}
	string s;
	do{getline(cin,s);}while(s[0]!='$');
	{
		string t;int id=in.size()-1;
		while(id>0&&in[id]!='\\') id--;
		for(int i=0;i<=id;i++) t+=in[i];
		s=t+s.substr(2);
	}
	FILE* f=freopen(s.c_str(),"wb",stdout);
	do{getline(cin,s);}while(s[0]!='$'||s[1]!='$');
	getline(cin,s);
	int l=s.size();
	unsigned char b1,b2,b3;
	for(int i=3;i<l;i+=4){
		if(s[i-1]=='='){
			b1=((base64id[s[i-3]]<<2)|((base64id[s[i-2]]&0x30)>>4));
			fwrite(&b1,sizeof(unsigned char),1,f);
			break;
		}
		if(s[i]=='='){
			b1=((base64id[s[i-3]]<<2)|((base64id[s[i-2]]&0x30)>>4));
			b2=(((base64id[s[i-2]]&0x0F)<<4)|((base64id[s[i-1]]&0x3C)>>2));
			fwrite(&b1,sizeof(unsigned char),1,f);
			fwrite(&b2,sizeof(unsigned char),1,f);
			break;
		}
		b1=((base64id[s[i-3]]<<2)|((base64id[s[i-2]]&0x30)>>4));
		b2=(((base64id[s[i-2]]&0x0F)<<4)|((base64id[s[i-1]]&0x3C)>>2));
		b3=(((base64id[s[i-1]]&0x03)<<6)|base64id[s[i]]);
		fwrite(&b1,sizeof(unsigned char),1,f);
		fwrite(&b2,sizeof(unsigned char),1,f);
		fwrite(&b3,sizeof(unsigned char),1,f);
	}
	fclose(stdin);fclose(stdout);
	return true;
}
int main(){
	cout<<"为了利于传播,请先压缩后再进行转换\n";
	OP:
	cout<<"请输入操作(z:编码;x:解码;h:帮助/关于):";
	char op;cin>>op;
	if(op=='h'){
		cout<<"\n        它是干什么的?\nbase64是一种将文件转换为文本的方法,\n这样就可以在只能传文字的地方传文件\n\n            关于\n本转换器由zhouhaoGG使用C++开发,\n未经允许,禁止转载\n\n";
		goto OP;
	}
	cout<<"请把需要转换的 文件 拖到这里:";
	string f;cin>>f;
	if(op=='x'){
		tobin(f);Sleep(100);
		MessageBox(GetForegroundWindow(),("已经成功转换!\n它已经生成在 "+filename(f)+" 旁边").c_str(),"已经成功转换",MB_OK);
	}else{
		tobase64(f);Sleep(100);
		MessageBox(GetForegroundWindow(),("已经成功转换!\n它已经生成在 "+filename(f)+" 旁边,\n名叫 out.txt,已为您打开").c_str(),"已经成功转换",MB_OK);
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...