当前位置:  技术问答>linux和unix

关于zlib源代码的一个疑问

    来源: 互联网  发布时间:2016-03-13

    本文导语:  大家好!     我目前在利用zlib库函数的源码为模块编写一个把文件压缩成.gz格式的功能,在看到gzio.c文件中的gzwrite函数时,产生了一个疑问:s->stream.next_out是装着压缩后的数据的缓冲,s->outbuf用来往压缩文件里写...

大家好!
    我目前在利用zlib库函数的源码为模块编写一个把文件压缩成.gz格式的功能,在看到gzio.c文件中的gzwrite函数时,产生了一个疑问:s->stream.next_out是装着压缩后的数据的缓冲,s->outbuf用来往压缩文件里写入压缩后的数据,那么在写之前应该是把s->stream.next_out赋给s->outbuf,但是源文件里却是s->stream.next_out = s->outbuf,这不是相反了吗,outbuf里面的数据从哪来,又怎么能往文件里写呢?请大家帮我解答一下,谢谢了
附上gzwrite的源码:
int ZEXPORT gzwrite (file, buf, len)
    gzFile file;
    voidpc buf;
    unsigned len;
{
    gz_stream *s = (gz_stream*)file;

    if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;

    s->stream.next_in = (Bytef*)buf;
    s->stream.avail_in = len;

    while (s->stream.avail_in != 0) {

        if (s->stream.avail_out == 0) {

            s->stream.next_out = s->outbuf;
            if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {
                s->z_err = Z_ERRNO;
                break;
            }
            s->stream.avail_out = Z_BUFSIZE;
        }
        s->in += s->stream.avail_in;
        s->out += s->stream.avail_out;
        s->z_err = deflate(&(s->stream), Z_NO_FLUSH);
        s->in -= s->stream.avail_in;
        s->out -= s->stream.avail_out;
        if (s->z_err != Z_OK) break;
    }
    s->crc = crc32(s->crc, (const Bytef *)buf, len);

    return (int)(len - s->stream.avail_in);
}

|
改成这样就好看了吧:

            if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {
                s->z_err = Z_ERRNO;
                break;
            }

            /* Prepare for the next deflate. */
            s->stream.next_out = s->outbuf;
            s->stream.avail_out = Z_BUFSIZE;

stream.next_out是指针,指向固定的outbut缓冲区。
deflate()会写next_out所指缓冲区,并递增该指针,并递减avail_out计数。
多次deflate()之后,缓冲区写满,avail_out变0,就写文件,并重置输出缓冲区。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Red Hat 9 中的zlib库
  • cygwin 编译 sdcv , configure时找不到 zlib
  • 怎么在linux上用zlib库写一个简单的文件压缩程序?
  • 数据压缩库 Zlib for Windows
  • 数据压缩库 zlib
  • 请推荐下好用的压缩库(ZLIB除外)
  • 请教:如何利用zlib解压缩!!
  • [压缩技术]zlib是如何通过参数来调整压缩比和速度?
  • zlib解压报端错误
  • 在线等,急,不小心删除zlib系统库
  • zlib Z_STREAM_ERROR
  • 操作系统 iis7站长之家
  • zlib库压缩求解。。。。
  • zlib的压缩和解压缩包 JZlib
  • 求教:安装zlib报错
  • 【继续100分求助】移植miniGUI,编译zlib库出错。
  • glib arm-linux交叉编译不通过,提示*** Working zlib library and headers not found ***
  • 为什么用zlib解压时出错?(内详,来者有分)
  • 安装 zlib 碰到的问题
  • 【高分求助】移植miniGUI,编译zlib库出错。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3