使用zlib uncompress()

时间:2018-01-21 21:52:55

标签: c++ zlib compression

我在使用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

1 个答案:

答案 0 :(得分:0)

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

  

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