当前位置: 技术问答>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);
}
我目前在利用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,就写文件,并重置输出缓冲区。
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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。