2011-06-30 56 views
2

有一个奇怪的问题 - 我的应用程序套件中的一个必须读取/写入Windows和Linux上使用的gzip压缩文件,并且我发现在Linux上使用zlib生成的文件比使用zlib生成的文件大2-3倍那些在Windows上使用GZipStream生成的。他们在任一平台上完美地阅读,所以我知道无论哪个平台创建文件,压缩都是正确的。问题是,文件在不同时间通过网络传输,显然文件大小是一个问题。zlib的gzip压缩和.NET的GZipStream使用的压缩之间有什么区别?

我的问题是:

  1. 有没有其他人遇到这个
  2. 是两者之间有一些记载区别?我知道GZipStream没有提供像使用zlib一样指定压缩级别的方法,但是我在zlib一侧使用了最大压缩。我不应该看到相对相同的文件大小,假设GZipStream被写入使用最大压缩以及?
+0

只是澄清,什么是压缩(本质上)是一个单一的文件,使用deflateInit2()与Z_BEST_COMPRESSION,Z_DEFLATED,16 + MAX_WBITS和Z_DEFAULT_STRATEGY使用gzip格式。 – Will

+0

您无法指定GZipStream的压缩级别。它肯定听起来不像你想要的,如果它们小3倍:) –

+0

确切的说......问题出在Linux端。这段时间我一直在思考这个问题,最后决定把这个问题扔给那位大师,看看他们是否有任何想法。 – Will

回答

1

答案是...... Linux版本从来没有压缩数据开始。进行了大量调试以找出导致该问题的缺陷,但在纠正之后,两种平台的尺寸现在都可以比较。

1

我想你遇到这种情况的原因不是因为使用了压缩算法,而是因为文件被压缩。从ZLIB手册:

“zlib数据格式被设计为紧凑且禁食在存储器中并在通信信道用的gzip格式被设计用于单压缩文件的文件系统,具有更大的比头部zlib维护目录信息,并使用比zlib更慢的检查方法。“

我认为发生的事情是你的linux机器上的文件被Tar'red在一起成为一个文件,然后一个文件被压缩。在WIndows中,我认为它会压缩每个单独的文件,然后将它们压缩到1个文件中。

这是我的理论,但没有什么可以真正支持它。以为我可能会在稍后在家尝试一些试用测试,只是为了填补我的好奇心。

+0

我会倾向于这一点,除非我知道它只有一个文件被压缩。我有一个专有的档案格式,我正在使用;生成档案,整个档案压缩为一个文件,然后结果被加密。两个平台上的过程相同。 – Will

+0

@愿意 - 那么对于我的理论呢。我将运行一些测试,看看我是否无法弄清楚发生了什么。我在VMWare虚拟机上安装了Linux,所以我会看看我是否无法弄清楚发生了什么,并更改我的答案。 – Icemanind

+0

感谢您的帮助。我一直在尝试各种组合,并没有什么接近于我在.NET端得到的结果。对我来说很奇怪,特别是知道zlib已经存在了多久。 – Will