📄 enlzw.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 + -