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