Linux环境下使用Qt对文件和二进制数据压缩

目录

 

一、压缩库简介

1、zlib

2、quazip

二、压缩库配置

1、zlib配置

2、quazip配置

三、文件压缩测试

1、使用zlib库压缩二进制数据

2、使用quazip库压缩文件


一、压缩库简介

1、zlib

zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发。笔者使用版本为zlib-1.2.8在Linux运行环境下进行开发。下载地址

2、quazip

QuaZip是一款开源库,使用了Trolltech的Qt库,如果您需要使用QIODevice API将文件写入ZIP存档或从一个文件中读取文件,QuaZip正是您需要的工具。新版迁移至Github下载地址,老版下载地址。笔者使用的为老版的quazip-0.7.3在Linux运行环境下进行开发。

二、压缩库配置

1、zlib配置

Step1:下载完成后,新建一个文件夹,在文件夹中添加一个zlib.pri文件。zlib.pri内容如下所示,将zlib.pri文件中的文件放入一个文件夹中,文件夹内容如图1所示。

INCLUDEPATH += $$PWD

SOURCES += $$PWD/adler32.c \
           $$PWD/compress.c \
           $$PWD/crc32.c \
           $$PWD/deflate.c \
           $$PWD/gzclose.c \
           $$PWD/gzlib.c \
           $$PWD/gzread.c \
           $$PWD/gzwrite.c \
           $$PWD/infback.c \
           $$PWD/inffast.c \
           $$PWD/inflate.c \
           $$PWD/inftrees.c \
           $$PWD/trees.c \
           $$PWD/uncompr.c \
           $$PWD/zutil.c
图1 zlib文件夹内容

Step2:在压缩测试项目的.pro文件中添加库的绝对路径。(可自设环境变量修改路径,这里不再给出方法) 

 

Step3:最后在QtCreator中构建项目。

2、quazip配置

Step1:下载完成后,提取quazip.pro,quazip.pri及文件中的头文件和源文件,将他们放入一个文件夹中。quazip.pri内容如下所示,文件夹内容如图2所示。

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
HEADERS += \
        $$PWD/crypt.h \
        $$PWD/ioapi.h \
        $$PWD/JlCompress.h \
        $$PWD/quaadler32.h \
        $$PWD/quachecksum32.h \
        $$PWD/quacrc32.h \
        $$PWD/quagzipfile.h \
        $$PWD/quaziodevice.h \
        $$PWD/quazipdir.h \
        $$PWD/quazipfile.h \
        $$PWD/quazipfileinfo.h \
        $$PWD/quazip_global.h \
        $$PWD/quazip.h \
        $$PWD/quazipnewinfo.h \
        $$PWD/unzip.h \
        $$PWD/zip.h

SOURCES += $$PWD/qioapi.cpp \
           $$PWD/JlCompress.cpp \
           $$PWD/quaadler32.cpp \
           $$PWD/quacrc32.cpp \
           $$PWD/quagzipfile.cpp \
           $$PWD/quaziodevice.cpp \
           $$PWD/quazip.cpp \
           $$PWD/quazipdir.cpp \
           $$PWD/quazipfile.cpp \
           $$PWD/quazipfileinfo.cpp \
           $$PWD/quazipnewinfo.cpp \
           $$PWD/unzip.c \
           $$PWD/zip.c
图2 quazip文件夹内容

Step2:在压缩测试项目的.pro文件中添加库的绝对路径。(可自设环境变量修改路径,这里不再给出方法)

Step3:最后在QtCreator中构建项目。

注:1、quazip依赖于zlib,使用quazip时请一同包含zlib库的zlib.pri。

       2、压缩测试项目不是quazip库项目

三、文件压缩测试

1、使用zlib库压缩二进制数据

Step1:包含头文件,#include "zlib.h"

Step2:测试代码

文件压缩:

Qstring m_strFilePath = Qstring("/test.txt")
std::unique_ptr<Bytef> EncodeData;//压缩数据
//压缩传入的文件数据
QFile file(m_strFilePath);
QByteArray ReadData;

if(file.open(QIODevice::ReadWrite|QIODevice::Text))
{
    ReadData= file.readAll();
    file.close();
}

long nOutLength = compressBound(ReadData.length());

EncodeData.reset(new Bytef[nOutLength]);
compress(EncodeData.get(),(uLongf*)&nOutLength,(Bytef*)ReadData.data(),ReadData.length());

QByteArray ByteData = QByteArray::fromRawData((char* )EncodeData.get(),nOutLength);

//压缩后文件长度,请储存进文件或数据库,读取时需要
long nDataLen = ReadData.length();

文件解压:

//解压函数    1、压缩数据    2、压缩文件原始长度    3、解压写入文件路径
bool UncompressFile(QByteArray ByteData,INT64 len,QString strPath)
{
    QFile file(strPath);
    if(file.open(QIODevice::ReadWrite|QIODevice::Truncate))
    {
        uLongf nLength = len;
        std::unique_ptr<Bytef> DecodeData(new Bytef[nLength]);//解压数据
        int ret = uncompress(DecodeData.get(),&nLength,(Bytef* )ByteData.data(),ByteData.length());
        //文件写入
        if(ret == Z_OK)
        {
            QByteArray Data = QByteArray::fromRawData((char*)DecodeData.get(),nLength);
            file.write(Data);
            Data.clear();
        }
        file.close();
        return true;
    }
    return false;
}

2、使用quazip库压缩文件

Step1:包含头文件,#include "JlCompress.h"

Step2:测试代码

文件压缩:

    bool ret = false;
    QString strCompressPath =QString("/ZipTest/test.zip");
    QString strFilePath = QString("/ZipTest/test.txt");
    ret = JlCompress::compressFile(strCompressPath,strFilePath);
    if(!ret)
    {
        qDebug("File compress failed");
    }

文件解压:

    QString strCompressPath =QString("/ZipTest/test.zip");
    QString strExtractFilePath = QString("/ZipTest/ExtractFile/");
    QStringList strFileList;
    strFileList = JlCompress::extractDir(strCompressPath,strExtractFilePath);
    for(int i=0;i<strFileList.size();i++)
    {
        qDebug("%s",qPrintable(strFileList.at(i)));
    }

Step3:确认对应文件夹中生成压缩文件test.zip和解压后的文件test.txt

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖晴的天

予人玫瑰,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值