『ZLIB』開源『壓縮』同『解壓』程式庫, 支持『DEFLATE』冇損壓縮算法,佢混合『LZ77算法』同『霍夫曼編碼』.
『DEFLATE』壓縮算法冇專利權.畀人大量應用係『網络』『圖檔』『文檔』『影片』.
.PNG/ Libpng | 圖檔解壓 |
.ZIP | 壓縮檔 |
.tar | 壓縮檔 |
.gz | 壓縮檔 |
HTTP | 壓縮傅送 |
FFmpeg | 影片解壓 |
下载『ZLIB』
http://www.zlib.net/ |
http://www.zlib.net/zlib-1.2.13.tar.gz |
『Android studio』內置『ZLIB』, 唔使下載.但要係『CMakeLists.txt』增添『zlib』庫.
CMakeLists.txt文檔 | |
find_library( z-lib z ) | 搜索zlib |
target_link_libraries( ${z-lib} ) | 連接zlib |
包含『ZLIB』頭文檔
#include <zlib.h> | Zlib-api |
#include <zconf.h> |
『z_stream』壓縮同解壓皆需此結构體
z_stream stream; | zlib流結构體 |
stream.zalloc = Z_NULL; | NULL用默認記憶體分配函数 |
stream.zfree = Z_NULL; | NULL用默認記憶體释放函数 |
stream.opaque = Z_NULL; | |
stream.next_in = (Bytef*)sour; | 蒞源 |
stream.avail_in = (uInt)sour_length; | 蒞源長 |
stream.next_out = dest; | 輸出 |
stream.avail_out = (uInt)*dest_length; | 輸出長 |
『ZLIB』壓縮分叁步
壓縮 | |
deflateInit(&stream, level) | 分配記憶體,level壓縮等級 |
deflate(&stream, flush); | 壓縮數據, flush設0 |
deflateEnd(&stream); | 释放記憶體 |
int deflateInit2( | deflateInit()加强版 |
z_streamp strm, | zlib流結构體 |
int level, | level壓縮等級0~9.
0:速度快,唔壓縮. 9:速度慢,壓縮率高. |
int method, | 壓縮算法僅支緩Z_DEFLATED |
int windowBits, | 處理RAW DEFLATE手法. |
int memLevel, | 指定記憶體分配MAX_MEM_LEVEL |
int strategy)); | 壓縮策略,僅影響壓縮比.默認Z_DEFAULT_STRATEGY |
level | 壓縮等級 |
#define Z_NO_COMPRESSION 0 | 唔壓縮 |
#define Z_BEST_SPEED 1 | 高速,低壓縮率 |
#define Z_BEST_COMPRESSION 9 | 高壓縮率, 慢速 |
#define Z_DEFAULT_COMPRESSION (-1) | 默認壓縮 |
windowBits | 處理RAW DEFLATE手法. |
8~15: | 純deflate壓縮 |
-8~-15: | zlib頭 + deflate + zlib尾 |
> 16: | Gzip頭+ deflate + Gzip尾 |
method | 壓縮算法 |
#define Z_DEFLATED 8 | DEFLATE冇損壓縮 |
memLevel | 記憶體分配 |
MemLevel=1 | 最小記憶體,速度慢壓縮比低 |
MemLevel=9
#define MAX_MEM_LEVEL 9 |
最大記憶體,最佳速度 |
MemLevel=8 | 默認值 |
strategy | 壓縮算法設定 |
#define Z_FILTERED 1 | 僅FILTERED生成數據 |
#define Z_HUFFMAN_ONLY 2 | 僅霍夫曼編碼 |
#define Z_RLE 3 | 匹配長度=1 |
#define Z_FIXED 4 | 禁霍夫曼編碼 |
#define Z_DEFAULT_STRATEGY 0 | 默認壓縮設定 |
『ZLIB』解壓分叁步
解壓 | |
inflateInit(&stream) | 分配記憶體 |
inflate(&stream, Z_NO_FLUSH); | 解压數據 |
inflateEnd(stream); | 释放記憶體 |
返回碼 | |
#define Z_OK 0 | |
#define Z_STREAM_END 1 | 結束 |
#define Z_NEED_DICT 2 | 愛密碼 |
#define Z_ERRNO (-1) | |
#define Z_STREAM_ERROR (-2) | |
#define Z_DATA_ERROR (-3) | 加密數據損壞壞,或缺失. |
#define Z_MEM_ERROR (-4) | 唔够記憶體 |
#define Z_BUF_ERROR (-5) | 唔够緩存 |
#define Z_VERSION_ERROR (-6) |
解壓示例
int Uncompress(PBYTE dest,int * dest_length,PBYTE sour,int sour_length)
{
z_stream stream;
int ret;
stream.zalloc = (alloc_func)0;
stream.zfree = (free_func)0;
stream.opaque = (voidpf)0;
stream.next_in = (Bytef*)sour;
stream.avail_in = (uInt)sour_length;
stream.next_out = dest;
stream.avail_out = (uInt)*dest_length;
MAX_MEM_LEVEL
ret = inflateInit2(&stream, 16+MAX_WBITS);
if (ret != Z_OK)
return ret;
ret = inflate(&stream, Z_NO_FLUSH);// 解压
*dest_length = stream.total_out;
inflateEnd(&stream);
return ret;
}
壓缩示例
bool Compress(PBYTE dest,int * dest_length,PBYTE sour,int sour_length, int level)
{
int ret, flush;
int sour_offset,dest_offset;
int have;
z_stream stream;
BYTE in[ZIP_CHUNK];
BYTE out[ZIP_CHUNK];
stream.zalloc = Z_NULL;// 内存分配函数
stream.zfree = Z_NULL;// 内存释放函数
stream.opaque = Z_NULL;
stream.next_in = (Bytef*)sour;
stream.avail_in = (uInt)sour_length;
stream.next_out = dest;
stream.avail_out = (uInt)*dest_length;
ret = deflateInit(&stream, level);// 内存分配
if (ret != Z_OK)
return false;
ret = deflate(&stream, flush); // 进行压缩
*dest_length = stream.total_out;
deflateEnd(&stream);// 释放内存
return ret;
}