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; }