【问题标题】:Unhandled exception while using zlib uncompress()使用 zlib uncompress() 时未处理的异常
【发布时间】:2018-01-21 21:52:54
【问题描述】:

我在使用 zlib uncompress() 函数执行解压缩时遇到一些问题。我压缩的文件作为 fileSource 传递给 uncompressFile(),没有给我抛出运行时异常并且工作得很好。我所做的基本上是使用 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(此处省略)。 compressedSizefileSize 都是全局变量。 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

【问题讨论】:

  • 我看不出是什么导致了这个运行时错误。 -- 是的,你可以。 Zlib 带有完整的源代码。你应该调试它。
  • 我同意,但也许压缩数据有可能以某种方式损坏,因此解压缩失败,我必须检查一下。
  • 您需要在 hex 或 base64 的压缩数据中添加前 30 字节 so 的示例,以便我们可以确定 uncompress 是否应该能够解压缩它。
  • @MarkAdler 添加了压缩文件的十六进制的 30 个字节。
  • 啊。这些是对 zlib 的第三方贡献,不受支持。由于报告的压缩和解压缩汇编代码存在问题,我计划在下一个版本中将它们从 contrib 目录中删除。

标签: c++ zlib compression


【解决方案1】:

禁用ASM686 选项以避免在构建zlib 时出现此类错误或其他类型的错误。正如马克阿德勒所说:

这些是对 zlib 的第三方贡献,不受支持。到期的 报告压缩和解压缩的问题 汇编代码,我打算将它们从 contrib 目录中删除 下一个版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2018-04-01
    相关资源
    最近更新 更多