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

📄 lzwfile.cpp

📁 用VC++实现LZW算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "lzwtable.h"
#include "lzwcode.h"
#include "lzwfile.h"
// this .cpp is not consider try{}catch{} error case
const int iFileUsedBufferLength=1024*10;
CFile* pfileIn,*pfileOut;
BYTE bEncodeGet[iFileUsedBufferLength],bDecodePut[iFileUsedBufferLength];
DWORD dwEncodeGetTotal;
int iEncodeGetPos,iDecodeGetPos;

BOOL LZWCheckFile(LPCSTR pszCheck)// is the file a HGLZ
{
	CFile fileCheck(pszCheck,CFile::modeRead|CFile::typeBinary);
	BOOL fR=LZWCheckFile(&fileCheck);
	fileCheck.Close();
	return fR;
}
BOOL LZWCheckFile(CFile* pfileCheck)// is the file a HGLZ
{
	WORD wRead;
	DWORD dwRead;
	BOOL fR=TRUE;
	if(pfileCheck->GetLength()<LZW_MIN_FILE_LENGTH)
		return FALSE;
	DWORD dwPos=pfileCheck->GetPosition();
	pfileCheck->SeekToBegin();
	pfileCheck->Read(&dwRead,4);
	if(dwRead==LZW_FILE_TAG)
	{
		pfileCheck->Seek(sizeof(LZWFILEHEAD),CFile::begin);
		pfileCheck->Read(&wRead,2);
		if(wRead!=LZW_NODE_TAG)
			fR=FALSE;
	}
	else
		fR=FALSE;
	pfileCheck->Seek(dwPos,CFile::begin);
	return fR;
}

int FindFileName(LPCSTR pszName)
{
	int iLen=strlen(pszName);
	for(int i=iLen-1;i>=0;i--)
	{
		if(pszName[i]=='\\')
			return i+1;
	}
	return 0;
}
BOOL EncodeGetNextByte(BYTE& bGet)
{
	//pfileIn->Read(&bGet,1);
	if(iEncodeGetPos==0)
	{
		int iRead=(dwEncodeGetTotal>=iFileUsedBufferLength)?
					iFileUsedBufferLength:(int)dwEncodeGetTotal;
		dwEncodeGetTotal-=(DWORD)iRead;
		pfileIn->Read(bEncodeGet,iRead);
	}
	bGet=bEncodeGet[iEncodeGetPos++];
	if(iEncodeGetPos>=iFileUsedBufferLength)
		iEncodeGetPos=0;
	return TRUE;
}
BOOL EncodePutNextBytes(BYTE* pbPut,int iPut)
{
	pfileOut->Write(pbPut,iPut);
	return TRUE;
}
BOOL DecodePutNextByte(BYTE bPut)
{
	pfileOut->Write(&bPut,1);
	return TRUE;
}
BOOL DecodeGetNextBytes(BYTE* pbGet,int iGet)
{
	pfileIn->Read(pbGet,iGet);
	return TRUE;
}
// for batch decompress files
BOOL LZWDecodeFileOnPosition(LPCSTR pszInFile,// compressed file
							LPCSTR pszOutPath,// file be decompressed
							DWORD dwPos,// the decompressed file position
							FUN_LZWDECODEDBYTES pfunDecodedBytes)
{
	char szNewPath[1000]={""};
	if(pszOutPath!=NULL)
	{
		strcpy(szNewPath,pszOutPath);
		if(szNewPath[strlen(szNewPath)-1]!='\\' &&szNewPath[strlen(szNewPath)-1]!=':')
			strcat(szNewPath,"\\");
	}
	CFile fileIn(pszInFile,
				CFile::modeRead|CFile::typeBinary);
	CString szOutFile;
	DWORD dwFileLength=fileIn.GetLength();
	if(dwFileLength
		<(sizeof(LZWFILEHEAD)+sizeof(LZWNODEHEAD)+sizeof(LZWSINGLEFILEHEAD)))
	{
		AfxMessageBox("error hglz file");
		fileIn.Close();
		return FALSE;
	}
	LZWFILEHEAD LZWFileHead;
	fileIn.Read(&LZWFileHead,sizeof(LZWFILEHEAD));
	if(LZWFileHead.dwFileTag!=LZW_FILE_TAG)
	{
		AfxMessageBox("not hglz file");
		fileIn.Close();
		return FALSE;
	}
	if(HIBYTE(LZWFileHead.wVersion)!=0 || LOBYTE(LZWFileHead.wVersion)>10)
	{
		AfxMessageBox("not the version");
		fileIn.Close();
		return FALSE;
	}
	LZWNODEHEAD LZWNodeHead;
	fileIn.Read(&LZWNodeHead,sizeof(LZWNODEHEAD));
	if(LZWNodeHead.wNodeTag!=LZW_NODE_TAG)
	{
		AfxMessageBox("not hglz file node");
		fileIn.Close();
		return FALSE;
	}
	if(LZWNodeHead.wDirectoryType!=LZW_NODE_BEGIN_COMPRESS)
	{
		AfxMessageBox("not begin compress");
		fileIn.Close();
		return FALSE;
	}
	LZWSINGLEFILEHEAD LZWSingleFileHead;
	for(DWORD d=0;d<dwPos;d++)
	{// skip the files before
		fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
		if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
		{
			AfxMessageBox("not hglz single file head");
			fileIn.Close();
			return FALSE;
		}
		//BYTE *pbFileNameRead=new BYTE[LZWSingleFileHead.wFileNameLength];
		//fileIn.Read(pbFileName,LZWSingleFileHead.wFileNameLength);
		fileIn.Seek(LZWSingleFileHead.dwFileCompressedLength+
						LZWSingleFileHead.wFileNameLength,
						CFile::current);
	}
	fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
	if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
	{
		AfxMessageBox("not hglz single file head");
		fileIn.Close();
		return FALSE;
	}
	BYTE *pbFileName=new BYTE[LZWSingleFileHead.wFileNameLength+1];
	fileIn.Read(pbFileName,LZWSingleFileHead.wFileNameLength);
	pbFileName[LZWSingleFileHead.wFileNameLength]='\0';
	szOutFile=szNewPath;
	szOutFile+=(char*)pbFileName;
	delete pbFileName;
	// create the out file
	CFile fileOut(szOutFile,
				CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
	pfileIn=&fileIn;
	pfileOut=&fileOut;
	if(LZWSingleFileHead.dwFileCompressedLength!=0)
	{
		CLZWDecode *pDecode=new CLZWDecode();
		pDecode->BeginLZWDecode(LZWSingleFileHead.dwFileCompressedLength,
								DecodeGetNextBytes,
								DecodePutNextByte,
								1024,
								(LZWSingleFileHead.dwFileOldLength>1000)?pfunDecodedBytes:NULL,
								LZWSingleFileHead.dwFileOldLength/100);
		fileOut.Flush();
		delete pDecode;
	}
	fileIn.Close();
	fileOut.Close();
	return TRUE;	
}					
// decompress a file
BOOL LZWDecodeFileToFile(LPCSTR pszInFile,
						LPCSTR pszOutFile,
						DWORD dwPos,
						FUN_LZWDECODEDBYTES pfunDecodedBytes)
{
	CFile fileIn(pszInFile,
				CFile::modeRead|CFile::typeBinary);
	DWORD dwFileLength=fileIn.GetLength();
	if(dwFileLength
		<(sizeof(LZWFILEHEAD)+sizeof(LZWNODEHEAD)+sizeof(LZWSINGLEFILEHEAD)))
	{
		AfxMessageBox("error hglz file");
		fileIn.Close();
		return FALSE;
	}
	LZWFILEHEAD LZWFileHead;
	fileIn.Read(&LZWFileHead,sizeof(LZWFILEHEAD));
	if(LZWFileHead.dwFileTag!=LZW_FILE_TAG)
	{
		AfxMessageBox("not hglz file");
		fileIn.Close();
		return FALSE;
	}
	if(HIBYTE(LZWFileHead.wVersion)!=0 || LOBYTE(LZWFileHead.wVersion)>10)
	{
		AfxMessageBox("not the version");
		fileIn.Close();
		return FALSE;
	}
	LZWNODEHEAD LZWNodeHead;
	fileIn.Read(&LZWNodeHead,sizeof(LZWNODEHEAD));
	if(LZWNodeHead.wNodeTag!=LZW_NODE_TAG)
	{
		AfxMessageBox("not hglz file node");
		fileIn.Close();
		return FALSE;
	}
	if(LZWNodeHead.wDirectoryType!=LZW_NODE_BEGIN_COMPRESS)
	{
		AfxMessageBox("not begin compress");
		fileIn.Close();
		return FALSE;
	}
	LZWSINGLEFILEHEAD LZWSingleFileHead;
	for(DWORD d=0;d<dwPos;d++)
	{// skip the files before
		fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
		if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
		{
			AfxMessageBox("not hglz single file head");
			fileIn.Close();
			return FALSE;
		}
		//BYTE *pbFileNameRead=new BYTE[LZWSingleFileHead.wFileNameLength];
		//fileIn.Read(pbFileName,LZWSingleFileHead.wFileNameLength);
		fileIn.Seek(LZWSingleFileHead.dwFileCompressedLength+
						LZWSingleFileHead.wFileNameLength,
						CFile::current);
	}
	fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
	if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
	{
		AfxMessageBox("not hglz single file head");
		fileIn.Close();
		return FALSE;
	}
	fileIn.Seek(LZWSingleFileHead.wFileNameLength,CFile::current);
	//BYTE *pbFileName=new BYTE[LZWSingleFileHead.wFileNameLength];
	//fileIn.Read(pbFileName,LZWSingleFileHead.wFileNameLength);
	//delete pbFileName;
	// create the out file
	CFile fileOut(pszOutFile,
				CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
	pfileIn=&fileIn;
	pfileOut=&fileOut;
	if(LZWSingleFileHead.dwFileCompressedLength!=0)
	{
		CLZWDecode *pDecode=new CLZWDecode();
		pDecode->BeginLZWDecode(LZWSingleFileHead.dwFileCompressedLength,
								DecodeGetNextBytes,
								DecodePutNextByte,
								1024,
								(LZWSingleFileHead.dwFileCompressedLength>1000)?pfunDecodedBytes:NULL,
								LZWSingleFileHead.dwFileCompressedLength/100);
		fileOut.Flush();
		delete pDecode;
	}
	fileIn.Close();
	fileOut.Close();
	return TRUE;	
}
// add another file to the compressed file
BOOL LZWAddEncodeFile(LPCSTR pszInFile,// file to be added
						LPCSTR pszOutFile,// compressed file
						FUN_LZWENCODEDBYTES pfunEncodedBytes)
{
	iEncodeGetPos=0;
	if(!LZWCheckFile(pszOutFile))
		return FALSE;

⌨️ 快捷键说明

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