亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lzwcode.cpp

?? 這是一個實現多媒體的lzw算法,有這方面需求的朋友可以下下啊,效果不錯.
?? CPP
字號:
#include "stdafx.h"
#include "stdio.h"
#include "memory.h"
#include "assert.h"
#include "lzwtable.h"
#include "lzwcode.h"

/*
CDecodeBitArray
*/
CDecodeBitArray::CDecodeBitArray(DWORD dwInitWidth)// width in bit
{
	m_pbBits=NULL;
	m_dwWidthInByte=0;
	m_dwTail=m_dwHead=0;
	if(dwInitWidth)
		InitBits(dwInitWidth);
}
CDecodeBitArray::~CDecodeBitArray()
{
	ClearBits();
}
void CDecodeBitArray::ClearBits(void)
{
	if(m_pbBits)
		delete m_pbBits;
	m_dwTail=m_dwHead=0;
	m_dwWidthInByte=0;
}
void CDecodeBitArray::InitBits(DWORD dwInitWidth)
{
	ClearBits();
	DWORD dwLength=dwInitWidth/8;
	dwLength+=(dwInitWidth%8)?1:0;
	m_pbBits=new BYTE[dwLength];
	m_dwHead=m_dwTail=0;
	m_dwWidthInByte=dwLength;
}
void CDecodeBitArray::InitBytes(DWORD dwInitWidth)
{
	InitBits(dwInitWidth*8);
}
DWORD CDecodeBitArray::GetLeftBytes(void)
{
	DWORD dwLeftBytes;
	DWORD dwLeftBits=GetLeftBits();
	dwLeftBytes=dwLeftBits/8;
	dwLeftBytes+=(dwLeftBits%8)?1:0;
	return dwLeftBytes;
}
WORD CDecodeBitArray::RemoveBits(int iWidth)
{
	WORD wGet=0;
	for(int i=iWidth-1;i>=0;i--)
	{
		if(RemoveFirstBit())
			SET_BIT_1(wGet,i);
	}
	return wGet;
}
WORD CDecodeBitArray::RemoveFirstBit(void)
{
	BYTE* pbFirstByte=m_pbBits+m_dwHead/8;
	BYTE bFirstByte=*pbFirstByte;
	WORD wGet=(CHECK_BIT_1(bFirstByte,7-m_dwHead%8))?1:0;
	m_dwHead++;
	return wGet;
}
BOOL CDecodeBitArray::AddBytes(BYTE* pbAdd,int iLength)
{
	if(m_pbBits==NULL)
		return FALSE;
	Resort();
	memcpy(m_pbBits+m_dwTail/8,pbAdd,iLength);
	m_dwTail+=8*(DWORD)iLength;
	return TRUE;
}
void CDecodeBitArray::Resort(void)
{// because m_dwTail%8 always equal 0
	if(m_dwHead<8)
		return;
	if(m_dwTail==m_dwHead)
	{
		m_dwTail=m_dwHead=0;
		return;
	}
	DWORD dwLength=GetLeftBytes();
	DWORD dwHead=m_dwHead%8;
	DWORD dwMove=m_dwHead-dwHead;
	memcpy(m_pbBits,m_pbBits+(m_dwHead/8),(int)dwLength);
	m_dwHead=dwHead;
	m_dwTail-=dwMove;
}

/*
class CEncodeBitArray
*/
CEncodeBitArray::CEncodeBitArray(DWORD dwInitWidth)
{
	if(dwInitWidth==0)
		m_pbBits=NULL;
	else
		InitBits(dwInitWidth);
}
CEncodeBitArray::~CEncodeBitArray()
{
	ClearBits();
}
BOOL CEncodeBitArray::InitBits(DWORD dwInitWidth)
{
	ClearBits();
	assert(dwInitWidth);
	m_dwWidthInByte=dwInitWidth/8;
	m_dwWidthInByte+=(dwInitWidth%8)?1:0;
	m_pbBits=new BYTE[m_dwWidthInByte];
	m_dwTail=0;
	return TRUE;
}
void CEncodeBitArray::ClearBits(void)
{
	if(m_pbBits)
		delete m_pbBits;
	m_pbBits=NULL;
}
BOOL CEncodeBitArray::AddBits(WORD wAdd,int iWidth)
{
	if(m_pbBits==NULL)
		return FALSE;
	for(int i=iWidth-1;i>=0;i--)
	{
		BYTE* pbByte=m_pbBits+m_dwTail/8;
		if(CHECK_BIT_1(wAdd,i))
			SET_BIT_1(*pbByte,7-m_dwTail%8);
		else
			SET_BIT_0(*pbByte,7-m_dwTail%8);
		m_dwTail++;
	}
	return TRUE;
}
DWORD CEncodeBitArray::GetBytesWidth(void)
{
	DWORD dwBytes=m_dwTail/8;
	dwBytes+=(m_dwTail%8)?1:0;
	return dwBytes;
}
int CEncodeBitArray::RemoveBytes(BYTE *pbGet,int iWant)
{
	if(m_pbBits==NULL)
		return -1;
	int iTotal=(int)GetBytesWidth();
	if(iWant>iTotal)
		iWant=iTotal;
	if(pbGet!=NULL)
		memcpy(pbGet,m_pbBits,iWant);
	memcpy(m_pbBits,m_pbBits+iWant,iTotal-iWant);
	int iTail=(int)m_dwTail;
	iTail-=iWant*8;
	if(iTail<0)
		iTail=0;
	m_dwTail=iTail;
	return iWant;
}
BOOL CLZWDecode::BeginLZWDecode(const DWORD dwLength,// the compressed length
								FUN_LZWDECODEGETNEXTBYTES pfunLZWGetNextBytes,
								FUN_LZWDECODEPUTNEXTBYTE pfunLZWPutNextByte,
								WORD wBuffer,
								FUN_LZWDECODEDBYTES pfunLZWDecodedBytes,
								DWORD dwBytesOnce)
{
	m_dwDecodedByte=0;
	//printf("enter decode press a key\n");
	BYTE *pbNewData=new BYTE[4000],*pbOutData=new BYTE[4000];
	BYTE *pbBuffer=new BYTE[wBuffer];
	BYTE bFirst;
	m_LZWTable.InitLZWTable();
	int iBitWidth=9;
	m_iTotalEntry=LZW_BEGIN_ENTRY;
	BYTE* pbDecodedData;
	WORD wOld,wLastLen;
	m_baContain.InitBits((wBuffer+20)*8);
	int iR=0;
	DWORD dwRead=0;
	while(1)
	{
		if(m_baContain.GetLeftBytes()<5)
		{
			WORD wGetBytes=wBuffer;
			if((DWORD)wGetBytes+dwRead>dwLength)
				wGetBytes=(WORD)(dwLength-dwRead);
			if(wGetBytes!=0)
			{
				pfunLZWGetNextBytes(pbBuffer,wGetBytes);
				m_baContain.AddBytes(pbBuffer,wBuffer);
				dwRead+=wGetBytes;
			}
		}
		int iT=m_iTotalEntry+1;
		iT>>=9;
		iBitWidth=9;
		while(iT>0)
		{
			iT>>=1;
			iBitWidth++;
		}
		WORD wGet=m_baContain.RemoveBits(iBitWidth);
		if(wGet==LZW_END_CODE)
		{
			break;
		}
		if(wGet==LZW_CLEAR_CODE)
		{
			m_LZWTable.InitLZWTable();
			wGet=m_baContain.RemoveBits(9);
			if(wGet==LZW_END_CODE)
				break;
			pbDecodedData=m_LZWTable.GetMatchData(wGet);
			WriteDecode(pbDecodedData,
						pfunLZWPutNextByte,
						pfunLZWDecodedBytes,
						dwBytesOnce);
			wOld=wGet;
			m_iTotalEntry=258;
		}
		else
		{// not clear
			pbDecodedData=m_LZWTable.GetMatchData(wGet);
			if(NULL!=pbDecodedData)
			{// in table
				bFirst=pbDecodedData[2];
				WriteDecode(pbDecodedData,
							pfunLZWPutNextByte,
							pfunLZWDecodedBytes,
							dwBytesOnce);
				if(wOld!=LZW_CLEAR_CODE)
				{// not the first code be read in
					pbDecodedData=m_LZWTable.GetMatchData(wOld);
					wLastLen=*((WORD*)pbDecodedData);
					memcpy(pbNewData,pbDecodedData+2,wLastLen);
					pbNewData[wLastLen]=bFirst;
					m_LZWTable.AddToChild((WORD)m_iTotalEntry,pbNewData,wLastLen+1);
					m_iTotalEntry+=1;
				}
				wOld=wGet;
			}
			else
			{
				pbDecodedData=m_LZWTable.GetMatchData(wOld);
				bFirst=pbDecodedData[2];
				wLastLen=*((WORD*)pbDecodedData);
				memcpy(pbOutData+2,pbDecodedData+2,wLastLen);
				pbOutData[wLastLen+2]=bFirst;
				*((WORD*)pbOutData)=wLastLen+1;
				WriteDecode(pbOutData,
							pfunLZWPutNextByte,
							pfunLZWDecodedBytes,
							dwBytesOnce);
				if(m_iTotalEntry>=4096)
				{
					int _j=0;
				}
				m_LZWTable.AddToChild((WORD)m_iTotalEntry,pbOutData+2,wLastLen+1);
				m_iTotalEntry+=1;
				wOld=wGet;
			}
		}
		//pbDecodedData=table.GetMatchData(wGet);
		//WORD wLen=*((WORD*)pbDecodedData);
		//pbDecodedData+=2;
	}
	delete pbNewData;
	delete pbOutData;
	delete pbBuffer;
	return dwRead==dwLength;
}								
void CLZWDecode::WriteDecode(BYTE* pbWrite,
							FUN_LZWDECODEPUTNEXTBYTE pfunLZWPutNextByte,
							FUN_LZWDECODEDBYTES pfunLZWDecodedBytes,
							DWORD dwBytesOnce)
{
	if(pbWrite==NULL)
		return;
	WORD wLength=*((WORD*)pbWrite);
	pbWrite+=2;
	for(DWORD i=0;i<wLength;i++)
	{
		pfunLZWPutNextByte(*pbWrite);
		pbWrite++;
		if((pfunLZWDecodedBytes!=NULL)
			&& (dwBytesOnce)
			&& (m_dwDecodedByte%dwBytesOnce==0))
		{
			pfunLZWDecodedBytes();
		}
	}
	m_dwDecodedByte+=wLength;
}
void CLZWDecode::EndLZWDecode(FUN_LZWDECODEPUTNEXTBYTE pfunLZWPutNextByte)
{
}

/*
CLZWEncode
*/
BOOL CLZWEncode::BeginLZWEncode(const DWORD dwLength,
								FUN_LZWENCODEGETNEXTBYTE pfunLZWGetNextByte,
								FUN_LZWENCODEPUTNEXTBYTES pfunLZWPutNextBytes,
								WORD wBufferLen,
								FUN_LZWENCODEDBYTES pfunLZWEncodedBytes,
								DWORD dwBytesOnce)
{
	m_dwCompressedLength=0;
	int iBufferLen=wBufferLen;
	BYTE bGet;
	m_LZWTable.InitLZWTable();// init the entry table
	m_baContain.InitBits((iBufferLen+8)*8);// init the bit array
	m_baContain.AddBits(LZW_CLEAR_CODE,9);// add the first clear code
	/// below : begin the algorithm
	PLZWENCODEENTRY pCurrent=m_LZWTable.GetHead();
	int iBitWidth;
	DWORD dwEncoded=0;
	for(DWORD i=0;i<dwLength;i++)
	{// for each byte
		if(!pfunLZWGetNextByte(bGet))
			return FALSE;
		PLZWENCODEENTRY pChild=m_LZWTable.FindMatchChild(bGet,pCurrent);
		if(pChild)
		{// has found the continue
			pCurrent=pChild;
		}
		else
		{// not find write last code & add new entry 
			iBitWidth=GetBitWidth();
			WORD wW=pCurrent->wCode;
			m_baContain.AddBits(wW,iBitWidth);// add last code to buffer
			m_LZWTable.AddToChild(bGet,pCurrent);// add last code to table
			if(m_baContain.GetBytesWidth()>(DWORD)iBufferLen)
			{
				m_dwCompressedLength+=(DWORD)iBufferLen;
				pfunLZWPutNextBytes(m_baContain.GetBits(),iBufferLen);
				m_baContain.RemoveBytes(NULL,iBufferLen);
			}
			if(m_LZWTable.GetTableEntryNumber()>=(m_wMaxEntry-3))
			{
				iBitWidth=GetBitWidth();
				m_baContain.AddBits(LZW_CLEAR_CODE,iBitWidth);
				m_LZWTable.InitLZWTable();
			}
			pCurrent=m_LZWTable.FindMatchChild(bGet,m_LZWTable.GetHead());
		}
		dwEncoded++;
		if(pfunLZWEncodedBytes && dwEncoded==dwBytesOnce)         
		{
			pfunLZWEncodedBytes();
			dwEncoded=0;
		}
	}
	iBitWidth=GetBitWidth();
	m_baContain.AddBits(pCurrent->wCode,iBitWidth);// add last code to buffer
	return TRUE;
}
void CLZWEncode::EndLZWEncode(FUN_LZWENCODEPUTNEXTBYTES pfunLZWPutNextBytes)
{
	int iBitWidth=GetBitWidth();
	m_baContain.AddBits(LZW_END_CODE,iBitWidth);
	m_dwCompressedLength+=m_baContain.GetBytesWidth();
	pfunLZWPutNextBytes(m_baContain.GetBits(),(int)m_baContain.GetBytesWidth());
	m_LZWTable.ClearLZWTable();
	m_baContain.ClearBits();
};
int CLZWEncode::GetBitWidth(void)
{
	int iTotal=(int)m_LZWTable.GetTableEntryNumber();
	iTotal>>=9;
	int iBitWidth=9;
	while(iTotal>0)
	{
		iTotal>>=1;
		iBitWidth+=1;
	}
	return iBitWidth;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线播精品第三| 一本色道久久综合亚洲91| 精品国产伦一区二区三区观看方式 | 色老头久久综合| 亚洲色欲色欲www在线观看| 91在线一区二区| 91在线小视频| 一区二区国产盗摄色噜噜| 在线观看一区不卡| 亚洲成国产人片在线观看| 91精品久久久久久久91蜜桃| 久久成人精品无人区| 久久久久成人黄色影片| 国产成人亚洲精品青草天美| 国产精品久久久久aaaa樱花| 色婷婷狠狠综合| 日日噜噜夜夜狠狠视频欧美人| 日韩一级黄色片| 国产在线播放一区| 中文字幕高清不卡| 色94色欧美sute亚洲线路二| 婷婷一区二区三区| 精品欧美一区二区久久 | 国产一区二区成人久久免费影院| 中文一区二区在线观看| 色域天天综合网| 日韩高清在线不卡| 国产亚洲欧美日韩日本| 99久久久无码国产精品| 亚洲第一主播视频| 精品av久久707| 97久久精品人人澡人人爽| 亚洲电影欧美电影有声小说| 精品国产成人系列| 91亚洲永久精品| 日本成人在线一区| 国产亚洲欧美一级| 欧美曰成人黄网| 精品一区二区三区视频在线观看| 中文字幕一区二区不卡| 丝瓜av网站精品一区二区| 26uuu国产在线精品一区二区| 99久久精品国产导航| 日本亚洲一区二区| 国产精品二区一区二区aⅴ污介绍| 欧美日韩成人激情| 国产成a人亚洲精| 亚洲电影第三页| 久久精品一区二区三区不卡牛牛| 欧洲生活片亚洲生活在线观看| 精品一区精品二区高清| 亚洲精品中文在线影院| 日韩欧美国产午夜精品| 一本色道久久综合亚洲91| 麻豆传媒一区二区三区| 亚洲欧美日韩国产中文在线| 精品久久久影院| 欧洲激情一区二区| 国产高清亚洲一区| 日韩在线一区二区| 亚洲天堂网中文字| 精品美女在线播放| 欧美天堂一区二区三区| 国产成人在线看| 日韩电影在线免费| 亚洲人成电影网站色mp4| 精品国产乱码久久久久久1区2区| 欧美探花视频资源| www.日本不卡| 久久成人精品无人区| 亚洲一区二区欧美| 国产精品美女视频| 精品少妇一区二区三区日产乱码| 色国产综合视频| 成人午夜免费视频| 久久99精品一区二区三区| 亚洲福利一二三区| 中文字幕一区二区三| 国产大陆a不卡| 蜜臀91精品一区二区三区| 一区二区三区在线影院| 日本一区二区久久| 精品国产99国产精品| 欧美片在线播放| 色94色欧美sute亚洲线路一久 | 日韩avvvv在线播放| 亚洲女人小视频在线观看| 国产日本欧洲亚洲| 欧美精品乱人伦久久久久久| 在线精品视频免费观看| av综合在线播放| 国产一区三区三区| 蜜桃视频在线观看一区| 亚洲风情在线资源站| 亚洲精品老司机| 中文字幕色av一区二区三区| 国产网红主播福利一区二区| 亚洲精品一区二区三区在线观看| 欧美久久久久久久久| 在线视频中文字幕一区二区| 91毛片在线观看| 成人app下载| 成人精品鲁一区一区二区| 国产成人综合网| 狠狠v欧美v日韩v亚洲ⅴ| 蜜桃在线一区二区三区| 日韩激情一区二区| 偷拍一区二区三区四区| 午夜精品爽啪视频| 91精品1区2区| 在线免费不卡电影| 欧美性色aⅴ视频一区日韩精品| 色爱区综合激月婷婷| 色偷偷久久人人79超碰人人澡| 91浏览器在线视频| 91在线免费播放| 日本韩国欧美在线| 91福利社在线观看| 欧美性色欧美a在线播放| 欧美三级电影一区| 欧美日韩综合在线免费观看| 欧美日韩国产天堂| 欧美日韩免费观看一区三区| 欧美区在线观看| 欧美一卡二卡三卡| 精品久久五月天| 久久久精品日韩欧美| 欧美激情一区二区三区不卡| 国产精品久久久久婷婷| 成人欧美一区二区三区| 樱花影视一区二区| 亚洲一区av在线| 日韩激情视频在线观看| 麻豆精品视频在线观看| 国产一区二区导航在线播放| 夫妻av一区二区| 一本大道综合伊人精品热热| 欧美视频一区二区三区在线观看| 欧美丰满少妇xxxxx高潮对白| 日韩亚洲欧美综合| 久久久精品黄色| av一区二区三区四区| 色呦呦国产精品| 欧美日韩性生活| 欧美不卡一区二区三区四区| 欧美极品美女视频| 亚洲男人电影天堂| 天天综合色天天综合色h| 麻豆传媒一区二区三区| 懂色av一区二区三区免费观看 | 一本一道波多野结衣一区二区| 欧美在线一二三| 欧美一区二区视频观看视频| 精品国产一区二区三区四区四| 久久久综合九色合综国产精品| 亚洲特级片在线| 五月婷婷激情综合| 国产在线国偷精品产拍免费yy| 成人福利视频在线看| 欧美图区在线视频| wwww国产精品欧美| 亚洲色图丝袜美腿| 日韩激情一二三区| 国产91精品入口| 欧美网站大全在线观看| 久久综合色播五月| 亚洲精品国产精华液| 久久不见久久见中文字幕免费| 99久久综合色| 日韩一区二区三区在线| 国产精品三级在线观看| 亚洲成人综合视频| 国产婷婷色一区二区三区在线| 亚洲欧洲精品成人久久奇米网| 日韩国产精品久久| 成人性生交大合| 91精品国产综合久久久久久 | 精品国产欧美一区二区| 中文字幕一区二区三区在线不卡| 日本欧美一区二区三区乱码 | 岛国一区二区在线观看| 欧美自拍偷拍一区| 国产午夜精品在线观看| 亚洲国产视频一区二区| 国产精品 欧美精品| 欧美美女一区二区三区| 日本一区二区三级电影在线观看| 亚洲福利一区二区三区| 成人精品免费看| 日韩三级伦理片妻子的秘密按摩| 日韩美女久久久| 九九精品一区二区| 91官网在线观看| 国产日韩影视精品| 日本三级亚洲精品| 色天天综合久久久久综合片| 国产亚洲欧美日韩日本| 日本欧美韩国一区三区| 日本高清视频一区二区| 久久九九全国免费|