c++ - zlib 的压缩函数没有做任何事情。为什么?

标签 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 header )。

<小时/>

最佳答案

根据您的原始文本:

fwrite (&before, ...

I am trying to compress it and store it into 'after'. I then write it into a file.

我认为不是。您正在将原始数据写入文件,您可能应该写入 after相反。

<小时/>

您应该养成的习惯是检查您关心的函数的返回值。换句话说,compress()如果出现问题,它会告诉您,但您似乎完全忽略了这种可能性。

同样,fwrite()还使用其返回值来指示是否成功。由于您没有包含显示如何设置的代码,因此这也是一种明显的可能性。特别是fwrite 没有义务一次性将整个 block 写入文件(设备可能已满,等等),这就是为什么它一个返回值,以便您可以检测到并针对这种情况进行调整。通常,更好的选择是:

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

是:

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

因为后者总是会为您提供一个表示完全成功的写入的信息,以及其他表示某些描述失败的信息。

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

除此之外,您还可以使用许多其他(通常适用的)方法来追踪问题,例如:

  • 在更改或设置后输出所有变量(例如函数的返回值 afterbeforevalue 等)。
  • 在运行程序之前删除输出文件,以确保重新创建它。
  • 通过调试器运行代码,以便您看到幕后发生了什么。
  • 清算after全部为零字节(或已知模式),以确保您不会在其中获得过时的数据。
<小时/>

并且,作为最后一种方法(假设 zlib 源代码是免费提供的),您还可以修改(或调试),以便您可以清楚地看到幕后发生的事情.

关于c++ - zlib 的压缩函数没有做任何事情。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36853777/

相关文章:

c++ - 编写一个程序,将文本作为输入并生成一个复制该文本的程序

c++ - '标识符' : redefinition errors ( error C2011 & error C2370)

c++ - 如何允许某些类的对象访问另一个类的对象的 protected 成员

c++ - 中止(核心转储)C++ Cygwin

c - 解决循环依赖 - C

c - 将整数与C中指针数组的元素相乘

c++ - 为什么 C 不允许从 char ** 到 const char *const * 的隐式转换(而 C++ 允许)?

c++ - 最新版本的 c++ 的引用页面

c++ - C 或 C++ 中的文本压缩

image-processing - 如何根据文件大小限制确定png尺寸?