【问题标题】:Uncompressing files with Qt qUnCompress function使用 Qt qUnCompress 函数解压缩文件
【发布时间】:2012-11-22 11:12:57
【问题描述】:

我阅读了有关解压缩 ZIP 文件的文档和帖子,但我还有其他问题。 我需要在 Qt 中解压缩 zip 文件。那是用 gzip 压缩的 XML 文件。 我知道 qUnCompress 可以解压缩使用 ZLIB 准备的 zip 文件,并且 ZLIB 的标头与 GZIP 不同。

正如我在文档中看到的:

注意:如果你想使用这个函数来解压缩使用 zlib 压缩的外部数据,你首先需要在包含数据的字节数组中添加一个四字节的标题。标头必须包含未压缩数据的预期长度(以字节为单位),以无符号、大端、32 位整数表示。

这是否意味着我必须在开头只放长度(双端)而不是压缩数据? 我做到了,但 qUncompress 函数出现错误:

qUncompress: Z_DATA_ERROR: 输入数据已损坏

【问题讨论】:

    标签: c++ qt zip gzip zlib


    【解决方案1】:

    您需要使用zlib 或其他实现DEFLATE 算法的库来编写自己的gUncompress() 函数。我个人更喜欢miniz

    http://code.google.com/p/miniz/

    这里有一些代码给你:

    #include <stdexcept>
    
    #include <QtCore>
    
    #ifndef TINFL_HEADER_FILE_ONLY
    # define TINFL_HEADER_FILE_ONLY
    #endif // TINFL_HEADER_FILE_ONLY
    extern "C" {
    # include "tinfl.h"
    }
    
    #include "guncompress.hpp"
    
    static tinfl_decompressor inflator;
    
    static QByteArray result(TINFL_LZ_DICT_SIZE, 0);
    
    //////////////////////////////////////////////////////////////////////////////
    QByteArray gUncompress(QByteArray const& data)
    {
      mz_uint8 const* inPtr(reinterpret_cast<mz_uint8 const*>(data.data()) + 10);
    
      tinfl_init(&inflator);
    
      size_t inAvail(data.size());
      size_t outTotal(0);
    
      tinfl_status ret;
    
      do
      {
        size_t inSize(inAvail);
        size_t outSize(result.size() - outTotal);
    
        ret = tinfl_decompress(&inflator,
          inPtr,
          &inSize,
          reinterpret_cast<mz_uint8*>(result.data()),
          reinterpret_cast<mz_uint8*>(result.data()) + outTotal,
          &outSize,
          0 
          );
    
        switch (ret)
        {
          case TINFL_STATUS_HAS_MORE_OUTPUT:
            inAvail -= inSize;
            inPtr += inSize;
    
            result.resize(2 * result.size());
    
          case TINFL_STATUS_DONE:
            outTotal += outSize;
            break;
    
          default:
            throw std::runtime_error("error decompressing gzipped content");
        }
      }
      while (TINFL_STATUS_DONE != ret);
    
      return QByteArray::fromRawData(result.data(), outTotal);
    }
    

    另请注意,zip 文件和 gzip 文件的格式不同。 Zip 文件需要以不同方式处理,因为它们包含它们所包含的文件目录。

    【讨论】:

      【解决方案2】:

      在 Qt 的源代码中查找 qzip.cpp、qzipreader_p.h、qzipwriter_p.h。可用于读写zip文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 2022-07-27
        相关资源
        最近更新 更多