2016-04-26 2 views
0
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); 

'before'にはオーディオデータが格納されており、圧縮して 'after'に格納しようとしています。私はそれをファイルに書き出します。ファイルは元のファイルと同じサイズですが、これまでと同じデータが含まれています(私が知る限り)。zlibの圧縮機能は何もしていません。どうして?

また、圧縮がOKを返すので、圧縮に失敗していないことがわかります。


私の唯一の問題は圧縮のどこかにあるようです(私は思う)。私は圧縮を実行することができますし、私は解凍して正しいデータを取り出すことができます。また、ファイルに書き込んでおり、fwriteは561152を返しますが、カウント(値)は684964です。したがって、fwriteに何か問題があるようです。私はより注意深く見て、後のデータは前のデータとは異なります。

561152は、私が持っている.wavファイルの元のオーディオデータと同じサイズです(もちろん.wavヘッダーは削除されています)。あなたのテキストに基づいて


答えて

0

fwrite (&before, ... 

私はそれを圧縮すると '後' にそれを保存しようとしています。私はファイルに書き込みます。

だと思います。 オリジナルのデータをファイルに書き込んでいますが、代わりにafterを書き込んでください。あなたがやっての習慣に取得する必要


他の事は、あなたが気に関数からの戻り値をチェックしています。言い換えれば、問題がまだ発生している可能性を完全に無視しているように見える場合は、compress()が通知します。

同様に、fwrite()も戻り値を使用して、成功したかどうかを示します。設定方法を示すコードは含まれていないので、これも別の可能性があります。特にfwriteで、のブロック全体を1回のヒットでファイルに書き込むという義務があります(デバイスがいっぱいになるなど)。そのため、にはの戻り値があるため、その状況を検出して調整できます。多くの場合、より良いオプション:

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

は次のとおりです。

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

後者は常に、あなたにいくつかの説明の故障のために何か他のものを完全に成功した書き込みのための1つを与えるからです。

これは、問題がどこにあるのかを確立する私の最初のステップになります。彼らはリターンのように(変更または設定された後、すべての変数を出力

  • その上で

    、などの問題を追跡するために使用することができ、他の多くの(一般的に適用可能な)方法は、あります機能の値、afterbeforevalueなど)。

  • プログラムを実行する前に出力ファイルを削除して、プログラムを新たに作成してください。
  • デバッガでコードを実行してください。を参照してください。
  • afterをすべてゼロバイト(または既知のパターン)にクリアして、そこに古いデータがないようにします。

そして、(zlibのソースコードは自由に利用可能であることを考えれば)最終的なアプローチとして、あなたはまた、変更(またはデバッグに)することができますそれはあなたがはっきり下で何が起こっているか見ることができるようにカバー。

+0

申し訳ありませんが、私はそれが同じデータであることをどのように把握しましたか?私はそれを元に戻すのを忘れてしまった。値は圧縮後の 'after'のサイズになるので、ファイルはまだ小さいはずです – Ben

+0

はい成功の値を返しました – Ben

+0

書かれたバイト数を示すので、 'fwrite()'の最初の形式が望ましいです。 2番目の形式では、部分的な書き込みについては教えられません。 – EJP

関連する問題