|
|
发表于 2008-3-27 11:42:00
|
显示全部楼层
Re:[新手]如何封装和解压游戏资源呢??
我有个很简单的加密程序,可以进行文件合并和分解,送给你吧。由于纯属于一时兴起练练手,代码写的很不规范,我都不还意思拿出来的说。。。
------------------------------------------------
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <windows.h>
using namespace std;
void go(fstream*,fstream*,fstream*,char *,char *);
void goback(fstream *);
char key[8]={'v','z','e','x','V','Z','E','X'};
int main(int argnum,char **arg)
{
bool mode=0;
bool man=false;
if (argnum==4)
{
mode=1;
}
else if (argnum==2)
{
mode=0;
}
else
{
man=true;
cout<<"本打包器由vzex制作,含基本的加密功能,不包\n含压缩功能,请不要将目标文件与其他文件重名\n"
<<"可以自建快捷+参数的方式进行打包和解包操作,\n一参数为解包三参数为打包,分别与菜单相对应.\n"
<<"\n1------------打包\n2------------解包\n";
int k;
cin>>k;
switch(k)
{
case 1:mode=1;
break;
case 2:mode=0;
break;
default:
return 0;
}
}
char *file1,*file2,*file3;
if (man)
{
char s1[20],s2[20],s3[20];
if (mode==1)
{
cout<<"请输入第一个要打包的文件名:\n";
cin>>s1;
file1=s1;
cout<<"请输入第二个要打包的文件名:\n";
cin>>s2;
file2=s2;
cout<<"请输入打包的目标文件名:\n";
cin>>s3;
file3=s3;
}
else
{
cout<<"请输入要解包的文件名:\n";
cin>>s1;
file1=s1;
}
}
else{
file1=arg[1];
if (mode==1)
{
file2=arg[2];
file3=arg[3];
}
}
if ((access(file1,0)!=0))
{
cout<<"文件不存在\n";
system("pause");
return 0;
}
fstream *load1=new fstream(file1,ios::in|ios::binary);
if (mode==1)
{
if ((access(file2,0)!=0))
{
cout<<"文件不存在\n";
system("pause");
return 0;
}
fstream *load2=new fstream(file2,ios::in|ios::binary);
fstream *back=new fstream(file3,ios: ut|ios::binary);
go(load1,load2,back,file1,file2);
}
else if (mode==0)
{
goback(load1);
}
else
{
return 0;
}
system("pause");
return 0;
}
void go(fstream *f1,fstream *f2,fstream *f3,char *a,char *b)
{
const int size=1;
char str1[size],str2[size];
char dest1[size];
char dest2[size];
int na=0,nb=0;
if (!(f1&&f2&&f3))
{
return ;
}
f1->read(str1,size);
f2->read(str2,size);
int knum=0;
while (1)
{
if (!f1->eof())
{
for(int i=0;i<size;i++)
{
dest1=str1^key[knum];
}
f3->write(dest1,size);
f1->read(str1,size);
na++;
//cout<<"a:"<<na<<endl;
knum++;
knum%=8;
}
if (!f2->eof())
{
for(int i=0;i<size;i++)
{
dest2=str2^key[knum];
}
f3->write(dest2,size);
f2->read(str2,size);
nb++;
//cout<<"b:"<<nb<<endl;
knum++;
knum%=8;
}
if (f2->eof()&&f1->eof())
{
break;
}
}
char sa[10],sb[10];
//f3->seekp(0,ios::end);
itoa(na,sa,10);
itoa(nb,sb,10);
cout<<na<<endl<<nb<<endl;
f3->write(a,16);
f3->write(b,16);
f3->write(sa,8);
f3->write(sb,8);
f1->close();
f2->close();
f3->close();
cout<<"合并成功完成\n作者:vzex\n";
}
void goback(fstream *f)
{
if (!f)
{
return ;
}
int knum=0;
f->seekg(-48,ios::end);
const int size=1;
char str[20];
ZeroMemory(str,20);
f->read(str,16);
fstream a(str,ios::out|ios::binary);
f->read(str,16);
fstream b(str,ios::out|ios::binary);
if (!b)
{
cout<<"asdasd"<<endl;
}
char num[8];
f->read(num,8);
int anum=atoi(num);
cout<<anum<<endl;
f->read(num,8);
int bnum=atoi(num);
cout<<bnum<<endl;
f->seekg(0);
f->read(str,size);
char dest[size];
//ZeroMemory(str,sizeof(size));
bool wa=true;
while (!f->eof())
{
for (int i=0;i<size;i++)
{
dest=str^key[knum];
}
if (wa)
{
wa=false;
if (anum>0)
{a.write(dest,size);
anum--;
knum++;
knum%=8;
}
else
{
continue;
}
}
else if(!wa)
{
wa=true;
if (bnum>0)
{b.write(dest,size);
bnum--;
knum++;
knum%=8;
}
else
{
continue;
}
}
if (bnum==0&&anum==0)
{
break;
}
f->read(str,size);
}
cout<<"分离成功完成\n作者:vzex\n";
a.close();
b.close();
f->close();
} |
|