在zlib中如何使用gzbuffer分配的缓冲区?

时间:2018-11-02 06:10:36

标签: zlib

试图了解gzbuffer在zlib中的用法。摘自手册(https://www.zlib.net/manual.html):

  

ZEXTERN int ZEXPORT gzbuffer OF((gzFile file,unsigned size));

     

设置此库的功能使用的内部缓冲区大小。默认缓冲区大小为8192字节。必须在gzopen()或gzdopen()之后以及任何其他读取或写入文件的调用之前调用此函数。缓冲存储器分配始终推迟到第一次读取或写入。分配了缓冲区空间大小的三倍。较大的缓冲区大小(例如64K或128K字节)将显着提高解压缩(读取)的速度。

     

新的缓冲区大小也会影响gzprintf()的最大长度。

     

gzbuffer()成功返回0,失败则返回–1,例如调用得太晚。

因此分配了三倍的缓冲区大小。当我调用gzwrite时,是将压缩数据写入缓冲区(每次调用gzwrite都进行压缩)还是将未压缩数据写入缓冲区? (然后压缩被延迟,直到缓冲区被填满并且内部调用gzflush或我自己调用gzflush为止)

当我继续调用gzwrite时,缓冲区已满怎么办?此时是否有一些新的缓冲内存分配,还是只是将缓冲区刷新到文件然后重新使用?

1 个答案:

答案 0 :(得分:0)

读取时,分配了size输入缓冲区,并分配了2*size输出缓冲区。写作时,是一样的,但是相反。

如果len中的size小于gzwrite(state, buf, len),则提供的数据将进入输入缓冲区。该输入缓冲区一旦累积了size个字节,便会被压缩。如果len大于或等于size,则压缩缓冲区中剩余的内容,然后压缩所有提供的len数据。如果请求刷新,则将输入缓冲区中的所有数据压缩。

压缩数据累积在size输出缓冲区中,每次累积size个压缩字节时,或者刷新或关闭gzFile时,都会写入压缩数据。

相关问题