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);
因为后者总是会为您提供一个表示完全成功的写入的信息,以及其他表示某些描述失败的信息。
这将是我确定问题所在的第一步。
除此之外,您还可以使用许多其他(通常适用的)方法来追踪问题,例如:
- 在更改或设置后输出所有变量(例如函数的返回值
after
、before
、value
等)。 - 在运行程序之前删除输出文件,以确保重新创建它。
- 通过调试器运行代码,以便您看到幕后发生了什么。
- 清算
after
全部为零字节(或已知模式),以确保您不会在其中获得过时的数据。
并且,作为最后一种方法(假设 zlib 源代码是免费提供的),您还可以修改(或调试)它,以便您可以清楚地看到幕后发生的事情.
关于c++ - zlib 的压缩函数没有做任何事情。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36853777/