【问题标题】:C++ Decompressing a file, then compressing the decompressed data does not give the same file as a resultC ++解压缩文件,然后压缩解压缩的数据不会给出相同的文件作为结果
【发布时间】:2020-11-15 10:05:06
【问题描述】:

我正在使用 ZLib 以及来自 https://github.com/mapbox/gzip-hpp 的头文件来处理 gzip 文件。

我已经尝试了好几天了。我有一个文件说“abc”,当我解压缩它时,我将它压缩回来并将压缩结果保存在另一个文件“xyz”中。现在,理论上,“abc”的数据应该等于“xyz”,但事实并非如此。正如我比较,这两个文件是不同的。我正在使用 fstream 读取/写入带有二进制标志的文件。我也尝试过不同的压缩级别,但失败了。我还检查了解压缩的数据,它是准确的。我唯一的麻烦是将其压缩回来,这会产生与原始结果不同的结果。

【问题讨论】:

  • 压缩结果取决于压缩设置(例如,窗口大小),因此不必相同。
  • 如果您的程序运行两次并将结果保存为不同的名称,是否会生成相同的文件?
  • 用于压缩的库可能也会影响结果
  • 我尝试了很多不同的设置,迈克,但都没有帮助。是的,我让它产生了 10 个不同的文件,但结果是一样的,退休忍者。 Alam,我尝试了 3 个不同的库,但结果相同。

标签: c++ compression zlib


【解决方案1】:

没有理由期望也没有必要能够重建相同的压缩数据。无损压缩的保证是 x -> compress -> decompress -> y 将导致 y 与 x 完全相同。 p -> decompress -> compress -> q 不能保证 q 与 p 相同,或与 p 相似,甚至与 p 相同长度。

由于压缩软件不同、同一压缩软件的不同版本或同一版本的压缩设置不同,差异可能会有所不同。

zlib 和 gzip 压缩器虽然由同一个人编写,但通常会产生不同的压缩数据,无论您选择何种设置。当他们决定发出 deflate 块时,他们在内部有不同的方法。

【讨论】:

  • 我正在制作一个游戏保存修改器并将保存文件加载回游戏中,它需要具有某种 gzip 格式并且我无法弄清楚。我希望这可以清除“也不需要能够重建相同的压缩数据”部分。
  • 不,这并不清楚。如果您需要完全相同的 gzip 流,请使用原始流。如果你修改的是gzip流的内容,那么就不能一样了。
  • “如果您需要完全相同的 gzip 流,则使用原始流”是什么意思?而且我已经明确表示我没有修改任何内容。
  • 我的意思是使用文件“abc”,而不是文件“xyz”。我的意思是不要解压缩和重新压缩。只需使用“abc”。
  • 那我就没法修改了。这就是问题所在。
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2010-09-05
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2010-12-14
相关资源
最近更新 更多