使用Qt qUnCompress功能解压缩文件
Uncompressing files with Qt qUnCompress function
我阅读了有关解压缩ZIP文件的文档和帖子,但我还有其他问题。我需要在Qt中解压缩zip文件。那是用gzip压缩的XML文件。我知道qUnCompress可以解压缩用ZLIB准备的zip文件,并且ZLIB的标头与GZIP不同。
正如我在文档中读到的:
注意:如果要使用此函数解压缩使用 zlib 压缩的外部数据,首先需要在包含数据的字节数组前面附加一个四字节标头。标头必须包含未压缩数据的预期长度(以字节为单位),表示为无符号的大端 32 位整数。
这是否意味着我必须在开头仅放置长度(bigendian)而不是压缩数据?我做到了,但我从 qUncompression 函数中出现错误:
q解压缩: Z_DATA_ERROR:输入数据已损坏
你需要使用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 文件需要以不同的方式处理,因为它们包含它们包含的文件目录。
在 Qt 的源代码中查找 qzip.cpp、qzipreader_p.h、qzipwriter_p.h。 它可用于读取和写入zip文件。
相关文章:
- 浏览压缩文件与游览解压缩它们
- 如何使用 Poco::ZIP 压缩/解压缩 zip 文件
- 如何在视觉工作室中使用C++解压缩压缩文件 (.zip)
- 使用膨胀来解压缩 png 文件
- 使用 libarchive 将 gzip 文件解压缩到内存
- 如何使用 zlib.h 库将.zip文件解压缩到文件夹中
- 使用Qt qUnCompress功能解压缩文件
- 如何有效地解压缩霍夫曼编码的文件
- 将文件从 Boost filtering_streambuf 解压缩到 std::vector<char>?
- 对解压缩文件(popen)的权限被拒绝
- 将文件从 Boost filtering_streambuf解压缩到 std::vector<unsigned char>?
- 解压缩加密文件(以字节为单位)
- 使用 libzip 将文件解压缩到磁盘
- 使用 zlib 解压缩.zip文件的简单方法
- 在霍夫曼压缩后将代码表存储在压缩文件中,并从此表构建用于解压缩的树
- 如何使用Lz4库解压缩小于原始大小的文件
- 有没有关于如何将包含文件夹和文件的zip文件解压缩到某个目录并通过MiniZip将其打包的教程
- 使用zlib/minizip:C/C++应用程序解压缩zip文件
- Zlib gzopen()返回压缩文件流.是否解压缩文件
- 如何在VS2013中压缩/解压缩文件夹