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

📄 main.cpp

📁 lz77算法原代码
💻 CPP
字号:
#include <windows.h>
#include <stdio.h>
#include <memory.h>
#include <iostream.h>

#include "lz77.h"

//////////////////////////////////////////////////////////////////
// out file format:
//		0,flag2,buffer; 0,flag2,buffer; ...flag1,flag2,bufferlast;
// flag1 - 2 bytes, source buffer block length
//			if block size is MAXSIZEBYTE, be zero
// flag2 - 2 bytes, compressed buffer length
//			if can not compress, be same with 0
//////////////////////////////////////////////////////////////////

void CallCompress(char *inFile,char *outFile)
{
	BYTE soubuf[MAXSIZEBYTE]="";
	BYTE destbuf[MAXSIZEBYTE + 16]="";

	FILE* in;
	FILE* out;
	in = fopen(inFile, "rb");
	if (in == NULL)
	{
		puts("Can't open source file");
		return;
	}
	out = fopen(outFile, "wb");
	if (out == NULL)
	{
		puts("Can't open dest file");
		fclose(in);
		return;
	}
	fseek(in, 0, SEEK_END);
	DWORD soulen = ftell(in);
	fseek(in, 0, SEEK_SET);

	UINT flag1=0, flag2=0;



	DWORD last = soulen;

	while ( last > 0 )
	{

		UINT act = min(MAXSIZEBYTE, last);
		fread(soubuf, act, 1, in);
		last -= act;
		if (act == MAXSIZEBYTE)
			flag1 = 0;
		else
			flag1 = act;

		fwrite(&flag1, sizeof(UINT), 1, out);


		CCompressLZ77 cc;
		UINT destlen= cc.Compress((BYTE*)soubuf, act, (BYTE*)destbuf);


		if (destlen == 0)		// can't compress the block
		{
			flag2 = 0;
			fwrite(&flag2, sizeof(UINT), 1, out);
			fwrite(soubuf, act, 1, out);
		}
		else
		{
			flag2 = (UINT)destlen;
			fwrite(&flag2, sizeof(UINT), 1, out);
			fwrite(destbuf, destlen, 1, out);
		}
	}
	fclose(in);
	fclose(out);
}


void CallDeCompress(char *inFile,char *outFile)
{
	BYTE soubuf[MAXSIZEBYTE]="";
	BYTE destbuf[MAXSIZEBYTE + 16]="";

	FILE* in;
	FILE* out;
	in = fopen(inFile, "rb");
	if (in == NULL)
	{
		puts("Can't open source file");
		return;
	}
	out = fopen(outFile, "wb");
	if (out == NULL)
	{
		puts("Can't open dest file");
		fclose(in);
		return;
	}
	fseek(in, 0, SEEK_END);
	DWORD soulen = ftell(in);
	fseek(in, 0, SEEK_SET);

	UINT flag1=0, flag2=0;


	DWORD last = soulen;
	UINT act;

	while (last > 0)
	{
		fread(&flag1, sizeof(UINT), 1, in);	  // 原文件的长度
		fread(&flag2, sizeof(UINT), 1, in);	  // 压缩文件的长度

		last -= 2 * sizeof(UINT);
		if (flag1 == 0) // 原文件长度大于8192
			act = MAXSIZEBYTE;
		else
			act = flag1;
		last-= flag2 ? (flag2) : act;

		if (flag2 == 0)
		{
			fread(soubuf, act, 1, in);
		}
		else
		{
			fread(destbuf, flag2, 1, in);
			CCompressLZ77 cc;
			if (!cc.Decompress((BYTE*)soubuf, act, (BYTE*)destbuf))
			{
				puts("Decompress error!");
				fclose(in);
				fclose(out);
				return;
			}
		}
		fwrite((BYTE*)soubuf, act, 1, out);
	}
	fclose(in);
	fclose(out);

}

void main()
{
	CallCompress("load.bin","m.txt");
	CallDeCompress("m.txt","1.bin");
}

/*
void main(UINT argc,char *argv[])
{	

	if(argc!=4)
	{
		puts("Usage: ");
		printf("  Compress : %s c sourcefile destfile\n", argv[0]);
		printf("  Decompress : %s d sourcefile destfile\n", argv[0]);
		return;
	}

	if (argv[1][0] == 'c'||argv[1][0]=='C') // compress	  
		CallCompress(argv[2],argv[3]);	

	else if (argv[1][0] == 'd'||argv[1][0] == 'D') // decompress
		CallDeCompress(argv[2],argv[3])	;
	else
	{
		puts("Usage: ");
		printf("  Compress : %s c sourcefile destfile\n", argv[0]);
		printf("  Decompress : %s d sourcefile destfile\n", argv[0]);		
	}  

}
*/

⌨️ 快捷键说明

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