私はいくつかの問題を実行しているzlib uncompress()関数による解凍。私が圧縮したファイルは、uncompressFile()にfileSourceとして渡されていて、ランタイム例外をスローしないで、完璧に動作しませんでした。基本的には、ファイルからfreadを読み込み、バッファで圧縮し、次に圧縮/伸長する。 私の解凍機能:
bool unCompressFile(const char* fileSource, const char* fileDestination) {
std::cout << "nFilesize: " << fileSize << std::endl << "compressedSize: " << compressedSize << std::endl;
// Test printout: fileSize = 164008 && compressedSize = 77778
// These were the values from a test program
char* bufferSource = new char[(sizeof(char) * compressedSize + 1)];
if (!bufferSource) {
std::cout << "Error allocating memory n"; return false;
}
// Reading from previously compressed file
FILE* inputFile = NULL;
inputFile = fopen(fileSource, "rb");
if (!inputFile) { return false; } // Error handling
if (!fread(bufferSource, compressedSize, 1, inputFile)) {
fclose(inputFile);
delete[] bufferSource;
return false;
}
fclose(inputFile);
uLong destinationLen = fileSize;
Bytef* bufferDestination = new Bytef[fileSize + 1];
int result = uncompress(bufferDestination, &destinationLen, (const Bytef*)bufferSource, compressedSize); // Here is the error
fclose(outputFile);
delete[] bufferSource;
delete[] bufferDestination;
return true;
}
文字列fileSourceはすでに圧縮されたファイルへのパスで、fileDestinationはfwriteを使用する出力です(ここでは省略します)。両方 compressedSize
そして fileSize
グローバル変数です。 fileSizeの値は元のファイルの長さ(バイト単位)で、compressedSizeは圧縮データのサイズ(compress()によって変更)です。例外は圧縮解除関数で発生します。そうでない場合、エラー・プリントは表示されません。このランタイムエラーの原因を調べることはできません。
編集1: 私はcompress2()で試してみましたが、圧縮レベル私は0(なし)を基本的に無圧縮で試して、私のunCompressFile関数が機能しました。何かが減圧を台無しにしていますが、私はそれを把握できません。
編集2: 圧縮ファイルの最初の30バイト:
78 9C EC B9 77 54 53 4D F4 2E 7C D2 03 84 10 31 90 84 1A A4 2B 1D 04 14 84 D0 51 EA 2B 55
回答:
回答№1は0無効にする ASM686
zlibをビルドするときに、この種のエラーや他の種類のエラーを避けるためのオプションです。 Mark Adlerが言ったように:
これらはzlibへの第三者の寄付であり、サポートされていません。支払期日 圧縮と解凍の両方に関する報告された問題 アセンブラコードでは、私はcontribディレクトリからそれらを削除する予定です。 次のバージョン。