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

📄 lzwfile.cpp

📁 LZW压缩算法源代码和示例程序代码c
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	CFile fileIn(pszInFile,
				CFile::modeRead|CFile::typeBinary);
	CFile fileOut(pszOutFile,
				CFile::modeReadWrite|CFile::typeBinary);
	pfileOut=&fileOut;
	pfileIn=&fileIn;
	LZWFILEHEAD LZWFileHead;//(LZW_FILE_TAG,(9<<8)|0,1);
	fileOut.Read(&LZWFileHead,sizeof(LZWFILEHEAD));
	LZWFileHead.dwFileCount++;
	fileOut.SeekToBegin();
	fileOut.Write(&LZWFileHead,sizeof(LZWFILEHEAD));
	
	fileOut.SeekToEnd();
	LZWSINGLEFILEHEAD LZWSingleFileHead;/*(LZW_SINGLE_FILE_TAG,
										0,
										dwOldFileLength,
										0,
										strlen(pszInFile));*/
	DWORD dwFileOldLength=fileIn.GetLength();
	LZWSingleFileHead.wSingleFileTag=LZW_SINGLE_FILE_TAG;
	LZWSingleFileHead.dwAttribute=0;
	LZWSingleFileHead.dwFileOldLength=dwFileOldLength;
	dwEncodeGetTotal=dwFileOldLength;
	int iFileNamePos=FindFileName(pszInFile);
	LZWSingleFileHead.wFileNameLength=strlen(pszInFile+iFileNamePos);
	fileOut.Write(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
	
	fileOut.Write(pszInFile+iFileNamePos,strlen(pszInFile+iFileNamePos));
	if(dwFileOldLength!=0)
	{
		CLZWEncode *pEncode=new CLZWEncode();
		pEncode->BeginLZWEncode(dwFileOldLength,
								EncodeGetNextByte,
								EncodePutNextBytes,
								1024,
								(dwFileOldLength>1000)?pfunEncodedBytes:NULL,
								dwFileOldLength/100);
		pEncode->EndLZWEncode(EncodePutNextBytes);
		LZWSingleFileHead.dwFileCompressedLength=
							(DWORD)pEncode->GetCompressedLength();
		DWORD dwCurrentPos=fileOut.GetPosition();
		DWORD dwLastSingleFileHeadPos=dwCurrentPos
									-LZWSingleFileHead.dwFileCompressedLength
									-LZWSingleFileHead.wFileNameLength
									-sizeof(LZWSINGLEFILEHEAD);
		//fileOut.Flush();
		/*fileOut.Close();
		fileOut.Open(pszOutFile,
					CFile::modeWrite|CFile::typeBinary);*/
		fileOut.Seek(dwLastSingleFileHeadPos,CFile::begin);
		fileOut.Write(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
		fileOut.Seek(dwCurrentPos,CFile::begin);
		fileOut.Flush();
		//fileOut.Seek(0,CFile::end);
		delete pEncode;
	}
	fileOut.Close();
	fileIn.Close();
	return TRUE;	
}
BOOL LZWEncodeFile(LPCSTR pszInFile,LPCSTR pszOutFile,
					FUN_LZWENCODEDBYTES pfunEncodedBytes)
{
	iEncodeGetPos=0;
	CFile fileIn(pszInFile,
				CFile::modeRead|CFile::typeBinary);
	CFile fileOut(pszOutFile,
				CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
	pfileOut=&fileOut;
	pfileIn=&fileIn;
	LZWFILEHEAD LZWFileHead;//(LZW_FILE_TAG,(9<<8)|0,1);
	LZWFileHead.dwFileTag=LZW_FILE_TAG;
	LZWFileHead.wVersion=(0<<8)|10;
	LZWFileHead.dwFileCount=1;
	fileOut.Write(&LZWFileHead,sizeof(LZWFILEHEAD));
	
	LZWNODEHEAD LZWNodeHead;//(LZW_NODE_TAG,LZW_BEGIN_COMPRESS,0);
	LZWNodeHead.wNodeTag=LZW_NODE_TAG;
	LZWNodeHead.wDirectoryType=LZW_NODE_BEGIN_COMPRESS;
	LZWNodeHead.wDirectoryNameLength=0;
	fileOut.Write(&LZWNodeHead,sizeof(LZWNODEHEAD));

	LZWSINGLEFILEHEAD LZWSingleFileHead;/*(LZW_SINGLE_FILE_TAG,
										0,
										dwOldFileLength,
										0,
										strlen(pszInFile));*/
	DWORD dwFileOldLength=fileIn.GetLength();
	LZWSingleFileHead.wSingleFileTag=LZW_SINGLE_FILE_TAG;
	LZWSingleFileHead.dwAttribute=0;
	LZWSingleFileHead.dwFileOldLength=dwFileOldLength;
	dwEncodeGetTotal=dwFileOldLength;
	int iFileNamePos=FindFileName(pszInFile);
	LZWSingleFileHead.wFileNameLength=strlen(pszInFile+iFileNamePos);
	fileOut.Write(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
	
	fileOut.Write(pszInFile+iFileNamePos,strlen(pszInFile+iFileNamePos));
	if(dwFileOldLength!=0)
	{
		CLZWEncode *pEncode=new CLZWEncode();
		pEncode->BeginLZWEncode(dwFileOldLength,
								EncodeGetNextByte,
								EncodePutNextBytes,
								1024,
								(dwFileOldLength>1000)?pfunEncodedBytes:NULL,
								dwFileOldLength/100);
		pEncode->EndLZWEncode(EncodePutNextBytes);
		LZWSingleFileHead.dwFileCompressedLength=
							(DWORD)pEncode->GetCompressedLength();
		DWORD dwCurrentPos=fileOut.GetPosition();
		DWORD dwLastSingleFileHeadPos=dwCurrentPos
									-LZWSingleFileHead.dwFileCompressedLength
									-LZWSingleFileHead.wFileNameLength
									-sizeof(LZWSINGLEFILEHEAD);
		//fileOut.Flush();
		/*fileOut.Close();
		fileOut.Open(pszOutFile,
					CFile::modeWrite|CFile::typeBinary);*/
		fileOut.Seek(dwLastSingleFileHeadPos,CFile::begin);
		fileOut.Write(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
		fileOut.Seek(dwCurrentPos,CFile::begin);
		fileOut.Flush();
		//fileOut.Seek(0,CFile::end);
		delete pEncode;
	}
	fileOut.Close();
	fileIn.Close();
	return TRUE;	
}
/*BOOL LZWDecodeFile(LPCSTR pszInFile,LPCSTR pszOutFile)
{
	return FALSE;
}*/
BOOL LZWParseFileHead(LPCSTR pszInFile,CString* pszOut)
{
	DWORD dwCount=0;
	CString szOut(pszInFile);
	char szTemp[1000];
	CFile fileIn(pszInFile,
				CFile::modeRead|CFile::typeBinary);
	DWORD dwFileLength=fileIn.GetLength();
	if(dwFileLength
		<(sizeof(LZWFILEHEAD)+sizeof(LZWNODEHEAD)+sizeof(LZWSINGLEFILEHEAD)))
	{
		AfxMessageBox("error file format");
		return FALSE;
	}
	LZWFILEHEAD LZWFileHead;
	fileIn.Read(&LZWFileHead,sizeof(LZWFILEHEAD));
	if(LZWFileHead.dwFileTag!=LZW_FILE_TAG)
	{
		AfxMessageBox("not hglz file");
		fileIn.Close();
		return FALSE;
	}
	szOut+="\n";
	sprintf(szTemp,
			"version %d.%d\nfile count %d\n",
			HIBYTE(LZWFileHead.wVersion),
			LOBYTE(LZWFileHead.wVersion),
			LZWFileHead.dwFileCount);
	szOut+=szTemp;
	dwCount=LZWFileHead.dwFileCount;
	
	LZWNODEHEAD LZWNodeHead;
	fileIn.Read(&LZWNodeHead,sizeof(LZWNODEHEAD));
	if(LZWNodeHead.wNodeTag!=LZW_NODE_TAG)
	{
		AfxMessageBox("not hglz file node");
		fileIn.Close();
		return FALSE;
	}
	if(LZWNodeHead.wDirectoryNameLength!=0)
	{
		ASSERT(0);
	}
	for(DWORD d=0;d<dwCount;d++)
	{
		LZWSINGLEFILEHEAD LZWSingleFileHead;
		fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
		DWORD dwPos=fileIn.GetPosition();
		if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
		{
			AfxMessageBox("not hglz single file head");
			fileIn.Close();
			return FALSE;
		}
		szOut+="file:";
		fileIn.Read(szTemp,LZWSingleFileHead.wFileNameLength);
		szTemp[LZWSingleFileHead.wFileNameLength]='\0';
		szOut+=szTemp;
		szOut+=" ";
		sprintf(szTemp,"ratio %.2f%%\n",
				(100*(float)LZWSingleFileHead.dwFileCompressedLength)
				/(float)LZWSingleFileHead.dwFileOldLength);
	
		szOut+=szTemp;
		dwPos+=LZWSingleFileHead.dwFileCompressedLength;
		dwPos+=LZWSingleFileHead.wFileNameLength;
		fileIn.Seek(dwPos,CFile::begin);
	}
	if(pszOut)
		*pszOut=szOut;
	else
		AfxMessageBox(szOut);
	fileIn.Close();
	return TRUE;	
}

BOOL LZWParseFileHead(LPCSTR pszInFile,CStringArray &szNameArray)
{
	DWORD dwCount=0;
	CString szOut(pszInFile);
	char szTemp[1000];
	CFile fileIn(pszInFile,
				CFile::modeRead|CFile::typeBinary);
	DWORD dwFileLength=fileIn.GetLength();
	if(dwFileLength
		<(sizeof(LZWFILEHEAD)+sizeof(LZWNODEHEAD)+sizeof(LZWSINGLEFILEHEAD)))
	{
		AfxMessageBox("error file format");
		return FALSE;
	}
	LZWFILEHEAD LZWFileHead;
	fileIn.Read(&LZWFileHead,sizeof(LZWFILEHEAD));
	if(LZWFileHead.dwFileTag!=LZW_FILE_TAG)
	{
		AfxMessageBox("not hglz file");
		fileIn.Close();
		return FALSE;
	}
	szOut+="\n";
	sprintf(szTemp,
			"version %d.%d\nfile count %d\n",
			HIBYTE(LZWFileHead.wVersion),
			LOBYTE(LZWFileHead.wVersion),
			LZWFileHead.dwFileCount);
	szOut+=szTemp;
	dwCount=LZWFileHead.dwFileCount;
	
	LZWNODEHEAD LZWNodeHead;
	fileIn.Read(&LZWNodeHead,sizeof(LZWNODEHEAD));
	if(LZWNodeHead.wNodeTag!=LZW_NODE_TAG)
	{
		AfxMessageBox("not hglz file node");
		fileIn.Close();
		return FALSE;
	}
	if(LZWNodeHead.wDirectoryNameLength!=0)
	{
		ASSERT(0);
	}
	for(DWORD d=0;d<dwCount;d++)
	{
		LZWSINGLEFILEHEAD LZWSingleFileHead;
		fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
		DWORD dwPos=fileIn.GetPosition();
		if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
		{
			AfxMessageBox("not hglz single file head");
			fileIn.Close();
			return FALSE;
		}
		szOut+="file:";
		fileIn.Read(szTemp,LZWSingleFileHead.wFileNameLength);
		szTemp[LZWSingleFileHead.wFileNameLength]='\0';
		szNameArray.Add(szTemp);
		szOut+=szTemp;
		szOut+=" ";
		sprintf(szTemp,"ratio %.2f%%\n",
				(100*(float)LZWSingleFileHead.dwFileCompressedLength)
				/(float)LZWSingleFileHead.dwFileOldLength);
	
		szOut+=szTemp;
		dwPos+=LZWSingleFileHead.dwFileCompressedLength;
		dwPos+=LZWSingleFileHead.wFileNameLength;
		fileIn.Seek(dwPos,CFile::begin);
	}
	fileIn.Close();
	return TRUE;	
}

⌨️ 快捷键说明

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