⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 压缩率较高的小工具 基于PAQ算法
💻 CPP
字号:
////////////////////////////////////////////////////////////////////////
//	UDA Shell 0.301 (2006.12.19) Author:dwing
////////////////////////////////////////////////////////////////////////
//#pragma comment(linker,"/MERGE:.data=.text")
//#pragma comment(linker,"/MERGE:.rdata=.text")
#include <time.h>
#include <io.h>
#include "uda.h"
#define BUFSIZE (1024*32)
const int ZMARK=(('Z')+('D'<<8)+(0x0F<<16)+(0<<24));
//	09 : 0.260-0.27x
//	0A : 0.280-0.282
//	0B : 0.283(UDA,only MODE-0)
//	0C : 0.284(UDA,only MODE-0)
//	0D : 0.29x
//	0E : 0.300(UDA,only MODE-0)
//	0F : 0.301(UDA,only MODE-0)
////////////////////////////////////////////////////////////////////////
void compress(char *fname,char *aname)
{
	unsigned i,j,fs,ns=0;
	U8 buf[BUFSIZE],*p;
	FILE *ar,*fp;
	double tm=clock();

	if(access(aname,0)!=-1) 	{printf("ERROR: %s already exists\n",aname);return;}
	if(!(fp=fopen(fname,"rb"))) {printf("ERROR: Can't open %s\n"	,fname);return;}
	if(!(ar=fopen(aname,"wb"))) {printf("ERROR: Can't create %s\n"	,aname);fclose(fp);return;}
	printf("%s => %s\n",fname,aname);
	fseek(fp,0,SEEK_END);fs=ftell(fp);fseek(fp,0,SEEK_SET);
	fwrite(&ZMARK,4,1,ar);fwrite(&fs,4,1,ar);

	Coder enc(Coder::ENC,ar);
	for(i=fs/BUFSIZE;i;--i)
	{
		if(fread(buf,1,BUFSIZE,fp)!=BUFSIZE) {printf("\nERROR: Can't read %s\n",fname);goto end_;}
		for(j=BUFSIZE,p=buf;j;--j) enc.enc(*p++);
		ns+=BUFSIZE; printf("\r%3.1lf%%",(double)ns*100/fs);
	}
	if((i=fs%BUFSIZE))
	{
		if(fread(buf,1,i,fp)!=i) {printf("\nERROR: Can't read %s\n",fname);goto end_;}
		for(j=i,p=buf;j;--j) enc.enc(*p++);
	}
	printf("\r100.0%% Finished!\n");
	if(fs)
	{
		enc.flush();
		i=ftell(ar); tm=(clock()-tm)/CLOCKS_PER_SEC*1000+1;
		printf("%u/%u in %.2lf sec, %.4lf bpb, %.1lf%% at %.1lf KB/s\n",
			i,fs,(double)tm/1000,(double)i*8/fs,(double)i*100/fs,(double)fs/tm);
	}
end_:
	fclose(ar);
	fclose(fp);
}
////////////////////////////////////////////////////////////////////////
void extract(char *aname,char *fname)
{
	unsigned i,j,fs,ns=0;
	U8 buf[BUFSIZE],*p;
	FILE *ar,*fp;
	double tm=clock();

	if(access(fname,0)!=-1) 	{printf("ERROR: %s already exists\n",fname);return;}
	if(!(ar=fopen(aname,"rb"))) {printf("ERROR: Can't open %s\n"	,aname);return;}
	fread(&i,4,1,ar);if(i!=ZMARK){printf("ERROR: Unknown format\n");fclose(ar);return;}
	if(!(fp=fopen(fname,"wb"))) {printf("ERROR: Can't create %s\n"	,fname);fclose(ar);return;}
	printf("%s => %s\n",aname,fname);
	fread(&fs,4,1,ar);

	Coder dec(Coder::DEC,ar);
	for(i=fs/BUFSIZE;i;--i)
	{
		for(j=BUFSIZE,p=buf;j;--j) *p++=dec.dec();
		if(fwrite(buf,1,BUFSIZE,fp)!=BUFSIZE) {printf("\nERROR: Can't write %s\n",fname);goto end_;}
		ns+=BUFSIZE;
		printf("\r%3.1lf%%",(double)ns*100/fs);
	}
	if((i=fs%BUFSIZE))
	{
		for(j=i,p=buf;j;--j) *p++=dec.dec();
		if(fwrite(buf,1,i,fp)!=i) {printf("\nERROR: Can't write %s\n",fname);goto end_;}
	}
	printf("\r100.0%% Finished!\n");
	if(fs)
	{
		i=ftell(ar); tm=(clock()-tm)/CLOCKS_PER_SEC*1000+1;
		printf("%u/%u in %.2lf sec, %.4lf bpb, %.1lf%% at %.1lf KB/s\n",
			i,fs,(double)tm/1000,(double)i*8/fs,(double)i*100/fs,(double)fs/tm);
	}
end_:
	fclose(fp);
	fclose(ar);
}
////////////////////////////////////////////////////////////////////////
void __cdecl main(int argc,char **argv)
{
	printf( "UDA 0.301 -- Experimental Console Version -- Base on PAQ8I -- 19 Dec 2006\n"
			"Author: dwing -- dwing@163.com -- http://wex.cn/dwing http://dwing.51.net\n");
	if(argc==4)
		switch(*argv[1])
		{
		case'e':case'E':compress(argv[2],argv[3]); return;
		case'd':case'D': extract(argv[2],argv[3]); return;
//		default: printf("ERROR: Unknown command \'%s\'\n",argv[1]);
		}
//	else
		printf( "Usage: uda e <in_filename> <out_filename> --- for compression\n"
				"       uda d <in_filename> <out_filename> --- for decompression\n"
				"Memory needed: 180 MB\n");
}
////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -