gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:01:44 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com