专栏文章
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 条评论,欢迎与作者交流。
正在加载评论...