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函数是最基本也是最常用的...
  • turingo
  • turingo
  • 2012年11月05日 12:03
  • 45106

zlib库剖析(4):使用示例example.c

下面分析test/example.c,它示范了zlib库的各个函数的使用。     下面代码定义要压缩的字符串、压缩时使用的字典、压缩/解压缩的内存分配策略等。 [cpp] view ...
  • Chinamming
  • Chinamming
  • 2013年12月01日 00:05
  • 3832

XOCDE7 '_compress2', referenced from:

友盟统计时出的错误 '_compress2', referenced from: +[UMANUtil deflatedDataPrefixedWith:level:source:...
  • goodai007
  • goodai007
  • 2016年07月12日 10:34
  • 1394

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

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

zlib中compress函数的使用方法

  1 #include    2 #include   3 #include   4 #include   5   6 using namespace std;  7   8 int main() ...
  • frankwangzy1103
  • frankwangzy1103
  • 2010年12月06日 17:23
  • 2767

C++内嵌代码使用压缩的方法(compress和uncompress函数)需要有zlib,编译时加-lz

转自:http://blogold.chinaunix.net/u3/118848/showart_2363489.html
  • pennyliang
  • pennyliang
  • 2011年04月01日 23:30
  • 11141

Ubuntu下问题 : undefined reference to `compress2‘ 的解决办法

Linux 系统下经常出现 undefined reference to functionName 的问题,原因大都是缺少必须的链接库,导致编译的时候找不到相应的函数体。 最近在编译ARC3D的时候...
  • Sway_2012
  • Sway_2012
  • 2013年05月06日 17:04
  • 1844

ArcSDE版本压缩(Compress)(2)

转载自:http://blog.csdn.net/linghe301/article/details/7777912 其实我在今年的开发者大会中专门对ArcGIS版本压缩做了一个详细的说明。为...
  • kone0611
  • kone0611
  • 2017年06月14日 12:00
  • 286

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

ZLIB:gzopen与compress2函数压缩的内容有什么不同?     zlib库中,可以用compress2()函数对一块内存区域进行压缩,也可以使用gzopen()和gzwrite...
  • linuxheik
  • linuxheik
  • 2013年12月18日 11:22
  • 1495

zlib库剖析(4):使用示例example.c

下面分析test/example.c,它示范了zlib库的各个函数的使用。     下面代码定义要压缩的字符串、压缩时使用的字典、压缩/解压缩的内存分配策略等。 [cpp] view ...
  • Chinamming
  • Chinamming
  • 2013年12月01日 00:05
  • 3832
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZLIB:gzopen与compress2函数压缩的内容有什么不同?
举报原因:
原因补充:

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