zlib的压缩功能没有做任何事情。为什么?

时间:2016-04-26 01:22:07

标签: c++ c compression zlib

before = new unsigned char[mSizeNeeded*4];

uLong value = compressBound(mSizeNeeded*4);
after = new unsigned char[value];

compress(after, &value, before, mSizeNeeded*4);

fwrite(&after, 1, value, file);

'前'有一堆音频数据存储在其中,我试图压缩它并将其存储在'之后。然后我把它写进一个文件。该文件与原始文件大小相同,它还包含之前的相同数据(据我所知)。

压缩也会返回OK,所以我知道压缩没有失败。

好的,所以看起来我唯一的问题是压缩中的某个地方(我认为)。我能够运行压缩,然后我可以解压缩并获得正确的数据。此外,它正在写入文件,fwrite返回561152但计数(值)是684964.所以看起来fwrite有问题。我仔细观察,后数据与之前的数据不同。

561152与我拥有的.wav文件中的原始音频数据大小相同(当然,去除了.wav标题)。

1 个答案:

答案 0 :(得分:0)

基于您的原始文字:

fwrite (&before, ...
  

我正在尝试压缩它并将其存储到'之后。然后我将其写入文件。

我想不是。您正在将原始数据写入文件,您可能应该编写after

你应该习惯做的另一件事是检查你关心的函数的返回值。换句话说,compress()会告诉您是否出现问题,但您似乎完全无视这种可能性。

同样,fwrite()也使用其返回值来指示它是否成功。由于您还没有包含显示其设置方式的代码,因此这也是一种独特的可能性。特别是fwrite 没有义务在一次点击中将整个块写入文件(设备可能已满,等等),这就是为什么它有< / em>返回值,因此您可以检测并调整该情况。通常,比以下更好的选择:

fwrite (&after, 1, value, file);

是:

fwrite (&after, value, 1, file);

因为后者总会给你一个完全成功的写作,而另一些则是因为某些描述的失败。

这将是我确定问题所在的第一步。

最重要的是,您可以使用许多其他(通常适用的)方法来追踪问题,例如:

  • 在更改或设置后输出所有变量(如函数的返回值,afterbeforevalue等等。
  • 在运行程序之前删除输出文件,以确保重新创建它。
  • 通过调试器运行代码,这样您就可以查看幕后发生的事情。
  • after清除为所有零字节(或已知模式),以确保您不会在其中获取陈旧数据。

并且,作为最终方法(假设zlib源代码是免费提供的),您还可以修改(或调试) it ,以便您可以清楚地看到它的内容在幕后。