设为首页收藏本站喵玉殿官方微博

喵玉殿论坛 · 喵玉汉化组

 找回密码
 少女注册中
搜索
查看: 2035|回复: 0

[特种技术] 使用 Zlib 压缩数据

[复制链接]
发表于 2012-3-5 12:07:57 | 显示全部楼层 |阅读模式
Zlib 导出了几个函数能很方便的压缩数据,deflate、deflateInit_、compress、compress比较简单。

deflateInit_ (strm), (level), ZLIB_VERSION, sizeof(z_stream)

ZLIB_VERSION 可以使用 zlibVersion 获得 level(压缩级别) 有 10 个 [-1 / 9]  -1默认压缩级别Z_DEFAULT_COMPRESSION,z_stream size 为 0x38

z_stream 结构
  1. typedef struct z_stream_s {

  2.     Bytef    *next_in; /* next input byte */

  3.     uInt     avail_in; /* number of bytes available at next_in */

  4.     uLong    total_in; /* total nb of input bytes read so far */

  5.     Bytef    *next_out; /* next output byte should be put there */

  6.     uInt     avail_out; /* remaining free space at next_out */

  7.     uLong    total_out; /* total nb of bytes output so far */

  8.     char     *msg;      /* last error message, NULL if no error */

  9.     struct internal_state FAR *state; /* not visible by applications */

  10.     alloc_func zalloc; /* used to allocate the internal state */

  11.     free_func zfree;   /* used to free the internal state */

  12.     voidpf     opaque; /* private data object passed to zalloc and zfree */

  13.    int     data_type; /* best guess about the data type: ascii or binary */

  14.     uLong   adler;      /* adler32 value of the uncompressed data */

  15.     uLong   reserved;   /* reserved for future use */

  16. } z_stream ;
复制代码
该结构为空deflateInit_执行完毕后该结构会被初始化,但是next_in、avail_in、next_out、avail_out结构成员需要手动填充。avail_in代表读入的数据量,next_in指向读入数据的指针,next_out代表数据压缩后的输出指针,avail_out代表数据压缩后的大小。

手动填充完这4个成员后调用deflate压缩数据。

deflate (z_streamp strm, int flush)

第一个参数是z_streamp结构指针,int flush有4个值可选Z_NO_FLUSH、Z_SYNC_FLUSH、Z_FULL_FLUSH、Z_FINISH 。Z_NO_FLUSH会设置该函数在压缩时会积聚多少数据,但是并不会输出压缩后的数据流,Z_SYNC_FLUSH会设置所有的未处理的输出传输到输出缓冲,Z_FULL_FLUSH同Z_SYNC_FLUSH差不多不过会把刷新状态会复位,Z_FINISH则和Z_NO_FLUSH差不多不过会输出被压缩的数据流。该函数会返回三种状态 负数 Error 、 0x0 Z_OK 、0x1 Z_STREAM_END到达文件末尾,可以检测返回值0x1来判断压缩是否结束。

最后记得deflateend
您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|手机版|小黑屋|无图版|喵玉殿

GMT+8, 2018-9-22 16:48

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表