zlib inflate z_stream

typedef struct z_stream_s {
    Bytef    *next_in; 
    uInt     avail_in; 
    uLong    total_in; 

    Bytef    *next_out;
    uInt     avail_out;
    uLong    total_out;

    char     *msg;     
    struct internal_state FAR *state;

    alloc_func zalloc; 
    free_func  zfree;  
    voidpf     opaque; 

    int     data_type; 
    uLong   adler;     
    uLong   reserved;  
} z_stream; 

当avail_in降到0时, 应用程序必须更新next_int和avail_in。当avail_out下降到0时,必须更新 next_out。

在调用初始化函数之前,应用程序必须初始化zalloc,zfree和opaque。其他所有字段都会被压缩库所赋值,而且

不会被应用程序更新。

应用程序提供的opaque的值将被作为调用zalloc和zfree的第一个参数传输出去,这样对配置内存管理器是

有好处的。

如果没有足够的内存空间分配给对象,zalloc必须返回Z_NULL,如果zlib被用作一个多线程应用,zalloc

和zfree必然是安全的。

在16位系统里,zalloc和zfree函数肯定可以分配65536字节的空间,但是如果MAXSEG_64K这个符号被

定义(参照zconf.h),将不会被要求分配更多的空间。警告:在MSDOS上,被zalloc返回的指针,它指向65536

个字节,必须将他们的偏移量规格化为0。被这个库提供的默认的分配函数确保了这些(参照zutil.c)。为了减少内

存需求和避免任何64K对象的分配,在消耗压缩比的情况下,用-DMAX_WBITS=14编译该库(参照zconf.h)。

total_in字段和total_out字段可以被用作统计或者进度报告。压缩完之后,total_in持有为压缩时的数据的

总大小,有可能会被保留用作解压装置。

 

关于deflate函数和inflate函数

ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
 

 ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));

Zlib的deflate, z_stream结构的使用

 

使用deflate进行压缩时,先要定义z_stream结构体,

先将z_stream的zalloc, zfree, opaque偏量设为Z_NULL, 再调用

deflateInit函数初始化z_stream结构,初始化时主要是用z_stream结构与Z_DEFAULT_COMPRESSION和默认压缩来初始化,

 

初始化好后,再要初始化四个重要分量,为被压缩源字符串next_in,被压源字符串的长度avail_in,压缩后字符串的最大长度(avail_out),压缩后字符串的存放缓冲区(next_out)。

 

     设好后,还得设一个参数即刷新方式flush, 这个参数是deflate函数的第二个参数,一般设为Z_FINISH, 或者Z_NO_FLUSH, 如果是读的文件取字符串

可以使用flush = feof(source) ? Z_FINISH : Z_NO_FLUSH再设定。

 

    以z_stream, flush为参数,调用deflate函数后,这时开始的next_out指向的内存中就有压缩的字符串了,但next_out, avail_out都会发生变化,其具体的变化是,avail_out会变为剩下的还没有使用的最大空间数,而next_out是指的原来的原来的指针加上所读的字符串,

 

压缩后,可以通过最大压缩空间大小减avail_out得压缩后串大小,通过原来的压缩串指针得压缩后字符串。

如果有任何错误,调用deflateEnd函数,当avail_out等于零时,表示加密串满了,则还要压,不过一般不可能因为压缩串不可能大于源串,如果加密串没满,那么,确认一下avail_in是否为0, 表示把源串全压了,再通过flush的值判断是否再压。

 

以上完成了一次压缩

Zlib压缩的数据

Zlib压缩时,是一种位运算,所以有可能将字符串截断(即其中为零的情况),这时如果以字符串来存,用strlen是有问题的,或者以txt来存(”w+”)就会有问题。因为”w+”默认是读txt, 如果有空的字符,便会停住.

此时要读它就得rb+来读,或者之前为wb+再存。这样就可以读取二制文件了。

二进制文件即存放的字符的可以是内存值。不一定是可见字符。

注意。如果先是txt文件类型,再二进制来读,就会有错误,或者以二进投覆盖原来的txt文件也会有错,得删掉它,再生成。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值