ZLIB:gzopen与compress2函数压缩的内容有什么不同?

转载 2012年03月28日 10:30:24
zlib库中,可以用compress2()函数对一块内存区域进行压缩,也可以使用gzopen()和gzwrite()两个函数将内存中的信息压缩后写入gz文件。
    测试中发现,如果把compress2()函数压缩后的内容直接写成文件,这个文件无法被gzip等程序打开,可见内存压缩后的内容并不是一个标准的gz文件。
    compress2()函数与gzopen()函数所产生的压缩内容到底有什么不同呢?下面是我的实验:

1、准备一个文本文件,字节数为9585字节。
2、分别使用
   gzopen("test_gzopen.txt.gz", "wb9")生成文件test_gzopen.txt.gz,文件长度4152
   和compress2(dst, &dst_len, src, src_len, 9)生成文件test_compress2.txt.gz,文件长度4140
3、使用二进制编辑器查看两个gz文件的内容,大部分是相同的。不同的部分为:
      test_gzopen.txt.gz的前面10个字节为:
      1F 8B 08 00 00 00 00 00 00 0B

      test_compress2.txt.gz的前面两个字节为:
      78 DA

      两个文件之后的4134个字节相同

      test_gzopen.txt.gz的最后8个字节为:
      83 1A E0 A6 71 25 00 00

      test_compress2.txt.gz的最后4个字节为:
      44 75 8B EF

4、gzip文件头中,1F 8B为GZIP文件的MAGIC NUMBER
   gzip文件的最后四个字节是文件的长度,Hex(71 25 00 00)=Dec(9585)
   gzip文件的倒数第五到第八个字节是CRC32校验码

5、参考了一篇关于zlib的文章:http://blog.developers.api.sina.com.cn/?tag=zlib
   猜想gzip文件的文件头大约是这个含义
      struct GzipHeader
      {
          char Id1;          //1f
          char Id2;          //8b
          char cm;           //08   Z_DEFLATED
          char flag;         //00
          char mime[4];      //00 00 00 00
          char xfl;          //00
          char os;           //0B 11-windows
      };

结论:
    可见,compress2()函数与gzopen()函数所产生的数据的压缩内容是相同的,仅仅只是产生的头不同而已。
    本来想写一个函数,将compress2()的压缩结果在内存中形成gzip的格式,但是校验码的问题一直搞不定,暂时未找到校验码是如何计算得出的,希望有这方面知识的朋友给我予指点,谢谢。

后记:
    研究zlib的目的,是想要自己实现一个简易的HTTP服务器,需要在HTTP服务器中实现内容的压缩下载。
    在返回的HTTP头中加上Content-Encoding: deflate或Content-Encoding: gzip就可以对相应的内容部分进行压缩输出。
    由于暂时没办法将compress2()函数压缩的结果转换为gzip格式,又不能使用gzopen()函数将数据压缩成文件再输出(IO操作一定很慢)。研究了一下发现,其实很容易解决:将HTTP头指定为deflate,将compress2()函数的压缩结果输出为:send(sock, buffer+2, compress_len-6)就实现了deflate方式的压缩。

==========================
参考:
http://www.zlib.net/    zlib Home Site
http://blog.developers.api.sina.com.cn/?tag=zlib   18个字节: gzip 与 deflate

========================================================
2009-04-02:补充
今天测试发现,使用deflate压缩方式,不能只输出压缩的数据部分,正确的输出方式应该是:
send(sock, buffer+2, compress_len-2)
也就是说仅仅去掉compress2()压缩后的前面两个字节,最后的四个字节不能去掉,否则发送到客户端的内容虽然能够正确显示,但是最后几个字节显示不出来。
所以deflate压缩方式应该只比gzip压缩方式少14字节,而不是18个字节。

相关文章推荐

zlib库compress和uncompress函数的使用方法

zlib(http://zlib.net/)提供了简洁高效的In-Memory数据压缩和解压缩系列API函数,很多应用都会用到这个库,其中compress和uncompress函数是最基本也是最常用的...

zlib库剖析(一)

本文整理自zlib.net以及zlib 1.2.7的手册页http://zlib.net/manual.html。     zlib是一套免费、通用、法律上不受限制的无损数据压缩库,可以在任何硬件及...

ZLIB:gzopen与compress2函数压缩的内容有什么不同?

zlib库中,可以用compress2()函数对一块内存区域进行压缩,也可以使用gzopen()和gzwrite()两个函数将内存中的信息压缩后写入gz文件。    测试中发现,如果把compress...

使用zlib库里的compress函数与uncompress函数

文件转自:http://blogold.chinaunix.net/u3/118848/showart_2363489.html zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函...
  • yuucyf
  • yuucyf
  • 2011-04-06 10:09
  • 2271

使用zlib库里的compress函数与uncompress函数

在第一次使用uncompress函数的时候,就把我弄得很老火,最后错误的原因现在具体是什么也没有弄明白,特别无语。 compress函数与uncompress函数可以跨平台。在Linux上编译链接时别...

Gzip压缩文件内容提高网页浏览速度(转自:http://www.funnyapple.com/gzip-compress-for-improving-web-speed.html)

由上图我们可以看到Yahoo的首页在YSLOW中的评分情况。今天我针对其中“Compress components with gzip”怎么个实现法,做下小介绍吧。其实我个人认为这条不是页面重构师所要...

linux下的文件压缩与打包---compress,gzip,zcat,bzip2,bzcat,tar,find,tarfile,tarball

linux下的文件压缩与打包

Win8 压缩Compress与解压Decompress函数实例

.版本 2 .支持库 iext .子程序 压缩 .局部变量 bool, 逻辑型 .局部变量 CompressorHandle .局部变量 temp, 字节集 .局部变量 tmp, 字节集 .局部变量...

Unix/Linux压缩命令 bzip/bzip2/zip/compress/dd/cpio/

bzip2 是一个基于Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的LZ77/LZ78压缩演算法来得好。若没有加上任何参数,bzip2压缩完文件后会产生.bz2的压缩文件,并删除...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)