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

📄 compress.cpp

📁 用FREE BASIC做的演示程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "Compress.h"
#include<malloc.h>
#include<memory.h>
bool GCompressNone::Compress(void*pOrgData,unsigned long dwOrgDataSize,void**ppCompressData,unsigned long & dwCompressedDataSize)
{
	*ppCompressData=new char[dwOrgDataSize];
	if(!(*ppCompressData))
		return false;
	memcpy(*ppCompressData,pOrgData,dwOrgDataSize);
	dwCompressedDataSize=dwOrgDataSize;
	return true;
}
bool GCompressNone::DecompressAutoSize(void*pCompressedData,unsigned long dwCompressedDataSize,void**ppOrgData,unsigned long & dwOrgDataSize)
{
	*ppOrgData=new char[dwCompressedDataSize];
	if(!(*ppOrgData))
		return false;
	memcpy(*ppOrgData,pCompressedData,dwCompressedDataSize);
	dwOrgDataSize=dwCompressedDataSize;
	return true;
}
bool GCompressNone::Decompress(void*pCompressedData,unsigned long dwCompressedDataSize,void*pDestAddr)
{
	memcpy(pDestAddr,pCompressedData,dwCompressedDataSize);
	return true;
}

bool GCompress8BitRLE::Compress(void*pOrgData,unsigned long dwOrgDataSize,void**ppCompressData,unsigned long & dwCompressedDataSize)
{
	unsigned char*pData=(unsigned char*)pOrgData;
	unsigned char*pDataEnd=pData+dwOrgDataSize;
	unsigned char*pTempAddr;
	unsigned char ubOldData;
	unsigned long dwRepCount;
	
	unsigned char*pCompressed=(unsigned char*)malloc(0xffff);
	if(!pCompressed)
		return false;
	memset(pCompressed,0,0xffff);
	unsigned long dwMaxSize=0xffff;
	unsigned long dwCurSize=0;
	
	unsigned char*pCmpData=pCompressed;
	while(pData<pDataEnd)
	{
		ubOldData=*pData;
		dwRepCount=1;
		pData++;
		while(pData<pDataEnd)
		{
			if(ubOldData!=*pData)
				break;
			if(dwRepCount>=0x7F)
				break;
			dwRepCount++;
			pData++;
		}
		if(1 != dwRepCount)
		{
			dwCurSize+=2;
			if(dwCurSize>=dwMaxSize)
			{
				dwMaxSize+=0xffff;
				unsigned char*pNewAddr=(unsigned char*)realloc(pCompressed,dwMaxSize);
				if(!pNewAddr)
				{
					free(pCompressed);
					return false;
				}
				pCompressed=pNewAddr;
				pCmpData=pNewAddr+dwCurSize-2;			
			}
			*pCmpData=(unsigned char)(0x80|dwRepCount);
			pCmpData++;
			*pCmpData=ubOldData;
			pCmpData++;
		}
		else
		{
			pTempAddr=pCmpData;
			pCmpData++;		
			dwCurSize++;
			if(dwCurSize+0x80>=dwMaxSize)
			{
				dwMaxSize+=0xffff;
				unsigned char*pNewAddr=(unsigned char*)realloc(pCompressed,dwMaxSize);
				if(!pNewAddr)
				{
					free(pCompressed);
					return false;
				}
				pCompressed=pNewAddr;
				pCmpData=pNewAddr+dwCurSize+1;
				pTempAddr=pCmpData-1;
			}
			while(pData<pDataEnd)
			{
				if(dwRepCount>=0x7F)
					break;
				if(ubOldData==*pData)
				{
					dwRepCount--;
					pData--;
					break;
				}
				*pCmpData=ubOldData;
				pCmpData++;
				ubOldData=*pData;
				pData++;
				dwRepCount++;
			}
			dwCurSize+=dwRepCount;
			*pTempAddr=(unsigned char)dwRepCount;
		}
	}
	*ppCompressData=realloc(pCompressed,dwCurSize);
	dwCompressedDataSize=dwCurSize;
	
	return true;	
}
bool GCompress8BitRLE::DecompressAutoSize(void*pCompressedData,unsigned long dwCompressedDataSize,void**ppOrgData,unsigned long & dwOrgDataSize)
{
	unsigned char*pData=(unsigned char*)pCompressedData;
	unsigned char*pDataEnd=pData+dwCompressedDataSize;
	unsigned long dwRepCount;
	
	unsigned char*pOrg=(unsigned char*)malloc(dwCompressedDataSize);
	if(!pOrg)
		return false;
	
	unsigned long dwMaxSize=dwCompressedDataSize;
	unsigned long dwCurSize=0;
	
	unsigned char*pOrgData=pOrg;
	while(pData<pDataEnd)
	{
		dwRepCount=(*pData & 0x7f);
		dwCurSize+=dwRepCount; 
		if(dwCurSize >= dwMaxSize)
		{
			dwMaxSize+=dwCompressedDataSize;
			unsigned char*pNewAddr=(unsigned char*)realloc(pOrg,dwMaxSize);
			if(!pNewAddr)
			{
				free(pOrg);
				return false;
			}
			pOrg=pNewAddr;
			pOrgData=pNewAddr+dwCurSize-dwRepCount;
		}
		if(0x80 & *pData)
		{
			pData++;
			for(unsigned int i=0;i<dwRepCount;i++)
			{
				*pOrgData=*pData;
				pOrgData++;
			}
			pData++;
		}
		else
		{
			pData++;
			for(unsigned int i=0;i<dwRepCount;i++)
			{
				*pOrgData=*pData;
				pData++;
				pOrgData++;
			}
		}
	}
	*ppOrgData=realloc(pOrg,dwCurSize);
	dwOrgDataSize=dwCurSize;
	
	return true;
}
bool GCompress8BitRLE::Decompress(void*pCompressedData,unsigned long dwCompressedDataSize,void*pDestAddr)
{
	unsigned char*pData=(unsigned char*)pCompressedData;
	unsigned char*pDataEnd=pData+dwCompressedDataSize;
	unsigned long dwRepCount;	
	unsigned char*pOrgData=(unsigned char*)pDestAddr;
	while(pData<pDataEnd)
	{
		dwRepCount=(*pData & 0x7f);
		if(0x80 & *pData)
		{
			pData++;
			for(unsigned int i=0;i<dwRepCount;i++)
			{
				*pOrgData=*pData;
				pOrgData++;
			}
			pData++;
		}
		else
		{
			pData++;
			for(unsigned int i=0;i<dwRepCount;i++)
			{
				*pOrgData=*pData;
				pData++;
				pOrgData++;
			}
		}
	}	
	return true;
}
bool GCompress16BitRLE::Compress(void*pOrgData,unsigned long dwOrgDataSize,void**ppCompressData,unsigned long & dwCompressedDataSize)
{
	unsigned short*pData=(unsigned short*)pOrgData;
	unsigned short*pDataEnd=pData+dwOrgDataSize;
	unsigned char*pTempAddr;
	unsigned short ubOldData;
	unsigned long dwRepCount;
	
	unsigned char*pCompressed=(unsigned char*)malloc(0xffff);
	if(!pCompressed)
		return false;
	memset(pCompressed,0,0xffff);
	unsigned long dwMaxSize=0xffff;
	unsigned long dwCurSize=0;
	
	unsigned char*pCmpData=pCompressed;
	while(pData<pDataEnd)
	{
		ubOldData=*pData;
		dwRepCount=1;
		pData++;
		while(pData<pDataEnd)
		{
			if(ubOldData!=*pData)
				break;
			if(dwRepCount>=0x7F)
				break;
			dwRepCount++;
			pData++;
		}
		if(1 != dwRepCount)
		{
			dwCurSize+=3;
			if(dwCurSize>=dwMaxSize)
			{
				dwMaxSize+=0xffff;
				unsigned char*pNewAddr=(unsigned char*)realloc(pCompressed,dwMaxSize);
				if(!pNewAddr)
				{
					free(pCompressed);
					return false;
				}
				pCompressed=pNewAddr;
				pCmpData=pNewAddr+dwCurSize-3;			
			}
			*pCmpData=(unsigned char)(0x80|dwRepCount);
			pCmpData++;
			*((unsigned short*)pCmpData)=ubOldData;
			pCmpData+=2;
		}
		else
		{
			pTempAddr=pCmpData;
			pCmpData++;		
			dwCurSize++;
			if(dwCurSize+0x100>=dwMaxSize)
			{
				dwMaxSize+=0xffff;
				unsigned char*pNewAddr=(unsigned char*)realloc(pCompressed,dwMaxSize);
				if(!pNewAddr)
				{
					free(pCompressed);
					return false;
				}
				pCompressed=pNewAddr;
				pCmpData=pNewAddr+dwCurSize+1;
				pTempAddr=pCmpData-1;
			}
			while(pData<pDataEnd)
			{
				if(dwRepCount>=0x7F)
					break;
				if(ubOldData==*pData)
				{
					dwRepCount--;
					pData--;
					break;
				}
				*((unsigned short*)pCmpData)=ubOldData;
				pCmpData+=2;
				ubOldData=*pData;
				pData++;
				dwRepCount++;
			}
			dwCurSize+=dwRepCount<<1;
			*pTempAddr=(unsigned char)dwRepCount;
		}
	}
	*ppCompressData=realloc(pCompressed,dwCurSize);
	dwCompressedDataSize=dwCurSize;
	
	return true;	
}
bool GCompress16BitRLE::DecompressAutoSize(void*pCompressedData,unsigned long dwCompressedDataSize,void**ppOrgData,unsigned long & dwOrgDataSize)
{
	unsigned char*pData=(unsigned char*)pCompressedData;
	unsigned char*pDataEnd=pData+dwCompressedDataSize;
	unsigned long dwRepCount;
	
	unsigned short*pOrg=(unsigned short*)malloc(dwCompressedDataSize<<1);
	if(!pOrg)
		return false;
	
	unsigned long dwMaxSize=dwCompressedDataSize;
	unsigned long dwCurSize=0;
	
	unsigned short*pOrgData=pOrg;
	while(pData<pDataEnd)
	{
		dwRepCount=(*pData & 0x7f);
		dwCurSize+=dwRepCount; 
		if(dwCurSize >= dwMaxSize)
		{
			dwMaxSize+=dwCompressedDataSize;
			unsigned short*pNewAddr=(unsigned short*)realloc(pOrg,dwMaxSize<<1);
			if(!pNewAddr)
			{
				free(pOrg);
				return false;
			}
			pOrg=pNewAddr;
			pOrgData=pNewAddr+dwCurSize-dwRepCount;
		}
		if(0x80 & *pData)
		{
			pData++;
			for(unsigned int i=0;i<dwRepCount;i++)
			{
				*pOrgData=*((unsigned short*)pData);
				pOrgData++;
			}
			pData+=2;
		}
		else
		{
			pData++;
			for(unsigned int i=0;i<dwRepCount;i++)
			{
				*pOrgData=*((unsigned short*)pData);
				pData+=2;
				pOrgData++;
			}
		}
	}
	*ppOrgData=realloc(pOrg,dwCurSize<<1);
	dwOrgDataSize=dwCurSize;
	
	return true;
}
bool GCompress16BitRLE::Decompress(void*pCompressedData,unsigned long dwCompressedDataSize,void*pDestAddr)
{
	unsigned char*pData=(unsigned char*)pCompressedData;
	unsigned char*pDataEnd=pData+dwCompressedDataSize;
	unsigned long dwRepCount;
	unsigned short*pOrgData=(unsigned short*)pDestAddr;
	while(pData<pDataEnd)
	{
		dwRepCount=(*pData & 0x7f);
		if(0x80 & *pData)
		{
			pData++;
			for(unsigned int i=0;i<dwRepCount;i++)
			{
				*pOrgData=*((unsigned short*)pData);
				pOrgData++;
			}
			pData+=2;
		}
		else
		{
			pData++;
			for(unsigned int i=0;i<dwRepCount;i++)
			{

⌨️ 快捷键说明

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