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

📄 enlzw.cpp

📁 LZW压缩算法源代码和示例程序代码c
💻 CPP
字号:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "memory.h"
#include "string.h"      
#include "conio.h"
#include "lzwtable.h"
#include "lzwcode.h"
#include "lzwfile.h"

FILE *pFLZW,*pFO;
char szFLZW[100],szFO[100];
int iTurn=0;

BYTE *bData;// for in put data
BYTE *bR;//for compressed data
BYTE *bResult;//for uncompressed data
int iTotal=0;
int iResult=0;
int iPut=0;

void testTable(void);
void EncodeLZW(void){};
void DecodeLZW(void){};
#define MAX_DATA			5000
int iDeGetPos=0;
int iDePutPos=0;
BOOL deGNB(BYTE* pbGet,int iGet)
{
	if(iDeGetPos+iGet>iTotal)
		iGet=iTotal-iDeGetPos;
	memcpy(pbGet,bR+iDeGetPos,iGet);
	iDeGetPos+=iGet;
	return TRUE;
}
BOOL dePNB(BYTE bPut)
{
	bResult[iDePutPos]=bPut;
	iDePutPos++;
	return TRUE;
}
BOOL GNB(BYTE& b)
{
	b=bData[iTurn++];
	return TRUE;
}
BOOL PNB(BYTE* pb,int iL)
{
	memcpy(bR+iPut,pb,iL);
	iPut+=iL;
	return TRUE;
}
void initData(void)
{
	FILE* pF=fopen("c:\\temp\\aaa","rb");
	fread(bData,MAX_DATA,1,pF);
	fclose(pF);
	//printf("\n");
	iTurn=0;
	iPut=0;
}
void terData(void)
{
	//printf("\n");
	for(int i=0;i<50;i++)
	{
		//printf("%d ",bData[i]);
	}
}
void writeDecode(BYTE* pbDecodeData)
{
	if(pbDecodeData==NULL)
	{
		return;
	}
	WORD wLength=*((WORD*)pbDecodeData);
	pbDecodeData+=2;
	memcpy(bResult+iResult,pbDecodeData,wLength);
	iResult+=wLength;
}
void seeEn(void)
{
	CDecodeBitArray ba(iTotal*8);
	ba.AddBytes(bR,iTotal);
	WORD wMax=258;
	for(int i=0;i<iTotal;i++)
	{
		int iT=(int)wMax+1;
		iT>>=9;
		int iBitWidth=9;
		if(iT>0)
		{
			iT>>=1;
			iBitWidth++;
		}
		WORD wG=ba.RemoveBits(iBitWidth);
		//printf("%d ",wG);
		if(wMax<wG)
			wMax=wG;
		if(wG==LZW_END_CODE)
			break;
	}
}
void testDecodeLZW(void)
{
	iDePutPos=iDeGetPos=0;
	CLZWDecode *decode=new CLZWDecode();
	BOOL fR=decode->BeginLZWDecode((DWORD)iTotal,deGNB,dePNB);
	char sz[100];
	sprintf(sz,"end uncompress %d",fR);
	AfxMessageBox(sz);
	delete decode;
}
void testEncodeLZW(void)
{
	iPut=0;
	iTurn=0;
	CLZWEncode *encode=new CLZWEncode();
	encode->BeginLZWEncode(MAX_DATA,GNB,PNB);
	encode->EndLZWEncode(PNB);
	iTotal=encode->GetCompressedLength();
	char szA[100];
	sprintf(szA,"compress %d to %d \nreduce to %.2f%%",
			MAX_DATA,
			iTotal,
			(100*(float)iTotal)/((float)MAX_DATA));
	AfxMessageBox(szA);
	//printf("result %d\n",iTotal);
	delete encode;
	//seeEn();         
};
void showEntry(int i)
{
	char szE[100];
	sprintf(szE,"entry %d",i);
	AfxMessageBox(szE);
}
void testDecodeLZWs(void)
{
	//printf("enter decode press a key\n");
	BYTE *bNewData=new BYTE[4000],*bOutData=new BYTE[4000];
	BYTE bFirst;
	CLZWDecodeTable *pt=new CLZWDecodeTable();
	if(pt==NULL)
	{
		//printf("error mem new table\n");
		return;
	}
	int iTurnInR=0;
	CLZWDecodeTable &table=*pt;
	int iBitWidth=9;
	WORD wCode;
	iResult=0;
	int iTotalEntry=258;
	BYTE* pbDecodedData;
	WORD wOld,wLastLen;
	CDecodeBitArray ba(50*8);
	while(1)
	{
		if(ba.GetLeftBytes()<10)
		{
			ba.AddBytes(bR+iTurnInR,30);
			iTurnInR+=30;
		}
		int iT=iTotalEntry+1;
		iT>>=9;
		iBitWidth=9;
		while(iT>0)
		{
			iT>>=1;
			iBitWidth++;
		}
		WORD wGet=ba.RemoveBits(iBitWidth);
		if(wGet==LZW_END_CODE)
		{
			showEntry(iTotalEntry);
			break;
		}
		if(wGet==LZW_CLEAR_CODE)
		{
			table.InitLZWTable();
			wGet=ba.RemoveBits(9);
			if(wGet==LZW_END_CODE)
				break;
			pbDecodedData=table.GetMatchData(wGet);
			writeDecode(pbDecodedData);
			wOld=wGet;
			iTotalEntry=258;
		}
		else
		{// not clear
			if(wGet>4096)
			{
				int _i=0;
			}
			pbDecodedData=table.GetMatchData(wGet);
			if(NULL!=pbDecodedData)
			{// in table
				bFirst=pbDecodedData[2];
				writeDecode(pbDecodedData);
				if(wOld!=LZW_CLEAR_CODE)
				{// not the first code be read in
					pbDecodedData=table.GetMatchData(wOld);
					wLastLen=*((WORD*)pbDecodedData);
					memcpy(bNewData,pbDecodedData+2,wLastLen);
					bNewData[wLastLen]=bFirst;
					table.AddToChild((WORD)iTotalEntry,bNewData,wLastLen+1);
					iTotalEntry+=1;
				}
				wOld=wGet;
			}
			else
			{
				pbDecodedData=table.GetMatchData(wOld);
				bFirst=pbDecodedData[2];
				wLastLen=*((WORD*)pbDecodedData);
				memcpy(bOutData+2,pbDecodedData+2,wLastLen);
				bOutData[wLastLen+2]=bFirst;
				*((WORD*)bOutData)=wLastLen+1;
				writeDecode(bOutData);
				table.AddToChild((WORD)iTotalEntry,bOutData+2,wLastLen+1);
				iTotalEntry+=1;
				wOld=wGet;
			}
		}
		//pbDecodedData=table.GetMatchData(wGet);
		//WORD wLen=*((WORD*)pbDecodedData);
		//pbDecodedData+=2;
	}
	delete bNewData;
	delete bOutData;
	delete pt;
};

void begin_main(BYTE* pbIn,BYTE* pbOut)
{
	//bData=new BYTE[MAX_DATA];
	//bR=new BYTE[MAX_DATA*2];
	//bResult=new BYTE[MAX_DATA*2];
	HGLOBAL hG1=::GlobalAlloc(GHND,MAX_DATA);
	bData=(BYTE*)::GlobalLock(hG1);
	HGLOBAL hG2=::GlobalAlloc(GHND,MAX_DATA*2);
	bR=(BYTE*)::GlobalLock(hG2);
	HGLOBAL hG3=::GlobalAlloc(GHND,MAX_DATA*3);
	bResult=(BYTE*)::GlobalLock(hG3);
	initData();
	testEncodeLZW(); 
	testDecodeLZW();
	terData();
	//printf("test table\n");
	//testTable();
	int iS=MAX_DATA/100;
	for(int i=0;i<100;i+=1)
	{
		pbIn[i]=bData[i*iS];
		pbOut[i]=bResult[i*iS];
	}
	for(i=0;i<MAX_DATA;i++)
	{
		if(bData[i]!=bResult[i])
		{
			AfxMessageBox("not match in a byte");
			break;
		}
	}
	::GlobalUnlock(hG1);
	::GlobalUnlock(hG2);
	::GlobalUnlock(hG3);
	::GlobalFree(hG1);
	::GlobalFree(hG2);
	::GlobalFree(hG3);
	/*delete bR;
	delete bData;
	delete bResult;*/
}

void testTable(void)
{
	BYTE bAdd[100];
	for(int i=0;i<100;i++)
	{
		bAdd[i]='a'+i%20;
	}
	CLZWDecodeTable *pt=new CLZWDecodeTable();
	if(pt==NULL)
	{
		//printf("error mem new table\n");
		return;
	}
	CLZWDecodeTable &table=*pt;
	for(i=258;i<4096;i++)
	{
		bAdd[0]='a'+i%26;
		bAdd[1]='A'+i%26;
		table.AddToChild(i,bAdd,2);
	}
	for(i=258;i<4096;i++)
	{
		BYTE* pGet=table.GetMatchData((WORD)i);
		if(pGet);
			//printf("NO. %d is %c %c\n",i,pGet[2],pGet[3]);
	}
	delete pt;

}

⌨️ 快捷键说明

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