zlib解壓壓縮數據

LiteSetup中的壓縮解壓代碼函數

zlib只是對內存段壓縮解壓,對於文件,咱們能夠分段 讀取到內存而後操做code

注意compressBound 有BUG內存

若是存在壓縮後的大小大於原大小,此函數返回的是壓縮後最大大小 就會有錯誤,致使內存溢出it

LiteSetup項目中發現這個BUG(如壓縮一個已經rar壓縮的文件,就可能溢出)class

UnCompressBlock*	Core::UnCompressBuffer(char*buffer, unsigned int len, unsigned int len_orign)
{
	UnCompressBlock *ret = new UnCompressBlock;

	char *dest = new char[len_orign + 10];


	if (0 == uncompress((Bytef*)dest, (uLongf*)&len_orign, (Bytef*)buffer, len))
	{
		ret->buffer = dest;
		ret->_size = len_orign;

		return ret;
	}

	delete[] dest;
    delete ret;
	return nullptr;
}


CompressBlock* Core::CompressBuffer(char * buffer, unsigned int _size)
{
	CompressBlock *ret = new CompressBlock;

	unsigned int len = compressBound((uLong)_size);

	char * dest = new char[len+1024*1024];

	if (compress((Bytef*)dest, (uLongf*)&len, (Bytef*)buffer, _size) == 0)
	{
		ret->buffer = dest;
		ret->_size = len;
		ret->_size_orign = _size;

		return ret;
	}
    delete ret;
	delete[]dest;
	return nullptr;
}
相關文章
相關標籤/搜索