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标题)。
答案 0 :(得分:0)
基于您的原始文字:
fwrite (&before, ...
我正在尝试压缩它并将其存储到'之后。然后我将其写入文件。
我想不是。您正在将原始数据写入文件,您可能应该编写after
。
你应该习惯做的另一件事是检查你关心的函数的返回值。换句话说,compress()
会告诉您是否出现问题,但您似乎完全无视这种可能性。
同样,fwrite()
也使用其返回值来指示它是否成功。由于您还没有包含显示其设置方式的代码,因此这也是一种独特的可能性。特别是fwrite
没有义务在一次点击中将整个块写入文件(设备可能已满,等等),这就是为什么它有< / em>返回值,因此您可以检测并调整该情况。通常,比以下更好的选择:
fwrite (&after, 1, value, file);
是:
fwrite (&after, value, 1, file);
因为后者总会给你一个完全成功的写作,而另一些则是因为某些描述的失败。
这将是我确定问题所在的第一步。
最重要的是,您可以使用许多其他(通常适用的)方法来追踪问题,例如:
after
,before
,value
等等。after
清除为所有零字节(或已知模式),以确保您不会在其中获取陈旧数据。并且,作为最终方法(假设zlib源代码是免费提供的),您还可以修改(或调试) it ,以便您可以清楚地看到它的内容在幕后。