QT(qCompress和qUncompress)与zlib(compress和uncompress)相互调用

因为QT也是用zlib库的,所以理论上数据是可以直接互通的,但现实是残酷的。通过对qCompress和compress压缩的数据进行打印,可以知道qCompress比compress的数据长四个字节,而这四个字节的内容则未压缩前的数据长度, 这四个字节在数据的最前面。通过内存观察到,qCompress这个四个字节的存储方式是大端在前,而WINDOWS系统存储方式是小端在前,所以需要对这四个字节进行增删就可以实现QT和zlib相互调用。

1、QT的qCompress压缩的数据调zlib的uncompress解压

只要把qCompress压缩的数据的前四位不要了,然后直接把后面的数据传过去,然后数据长度-4。

int QtToZLIBUncompr(char *pDest, uLongf *pDestLen, const char *pQtComprData, uLongf dataLen)
{
    return uncompress((Byte *)pDest, pDestLen, (const Bytef*)pQtComprData + 4, dataLen - 4);
}

QT环境测试:

QString test = "asdf451A21D54sadAS";
char uncompr[100] = {0};
uLong uncomprLen = 100;
QByteArray qbyteArray = qCompress(test.toLocal8Bit());
int err = QtToZLIBUncompr(uncompr, &uncomprLen, qbyteArray.data(), qbyteArray.length())
//如果不初始化,且数据是字符串,记得在返回解压长度uncomprLen的下标位置添加结束符'\0'或者赋值0。
//uncompr[uncomprLen] = 0;
if(err)
	qDebug() << "zlib uncompress the failure. error code:" << err;
else
	qDebug() << "zlib uncompress the success. data:" << uncompr;

2、zlib的compress压缩的数据调QT的qUncompress解压

只要在数据的前插入四个字节(数据长度),然后数据长度+4。

//qUncompress好像对前四位的原数据长度没要求,乱填都可以,只不过性能有些差距。
QByteArray zlibToQtUncompr(const char *pZLIBData, uLongf dataLen/*, uLongf srcDataLen = 0x100000*/)
{
    char *pQtData = new char[dataLen + 4];
    char *pByte = (char *)(&dataLen);/*(char *)(&srcDataLen);*/
    pQtData[3] = *pByte;
    pQtData[2] = *(pByte + 1);
    pQtData[1] = *(pByte + 2);
    pQtData[0] = *(pByte + 3);
    memcpy(pQtData + 4, pZLIBData, dataLen);
    QByteArray qByteArray(pQtData, dataLen + 4);
    delete []pQtData;
    return qUncompress(qByteArray);
}

QT环境测试:

char test2[] = "asdf451A21D54sadAS";
char compr[100];
int err = compress((Byte *)compr, &len, (const Bytef*)test2, strlen(test2));
if(err)
	qDebug() << "zlib compress the failure. error code:" << err;
else
{
	qDebug() <<  "zlib uncompress the success. data:" << zlibToQtUncompr(compr, 30);
}

就上面的数据,对zlibToQtUncompr调10000次,release模式下,如果前四位的原数据长度如果填1,执行时间在0.057-0.063秒之间。如果填前四位的原数据长度>=原数据长度,执行时间在0.005秒。可见效率差距多大,差了10倍。这效率差很有可能是差在分配内存,因为缓存空间过小后要重新分配,重复次数越多,效率就越慢。但如果前四位的原数据长度过大,qUncompress就会解压失败,很可能是要分配的空间过大。

目前验证过C/C++、JAVA的库都可以用。理论上应该是QT与所有语言的zlib库都能通过以上的方式执行压缩解压。

<think>好的,用户想了解如何对.Z文件进行压缩解压,包括方法、工具示例。首先,我需要确认.Z文件是什么格式。通常,.Z扩展名是Unix系统下使用compress命令生成的压缩文件,属于早期的LZW压缩算法。现在可能不太常见,但仍有用户需要处理这种格式。 接下来,我要回忆相关的工具。在Linux系统中,常用的处理.Z文件的命令是compressuncompress。不过现在很多系统可能默认没有安装,需要安装ncompress包。此外,gzipgunzip也可以处理,通过使用参数来支持.Z格式。例如,gunzip可以解压.Z文件,而gzip可以通过参数指定生成.Z格式的压缩文件。 另外,用户可能在使用不同操作系统,比如Windows,所以需要提供跨平台的工具。例如,7-Zip或PeaZip这样的工具支持多种格式,包括.Z文件。需要确认这些工具是否确实支持,可能需要查阅文档。 然后,用户可能需要具体的命令示例。例如,在Linux下使用compressuncompress,或者用gzip来压缩解压。同时,如果用户使用Windows,可能需要指导他们安装7-Zip并使用GUI或命令行进行操作。 还要注意,Z文件通常只能压缩单个文件,如果需要压缩多个文件或目录,可能需要先打包成tar,再压缩成.tar.Z。因此,可能需要提供相关的tar命令示例,比如tar cvf file.tar目录后,用compress处理,或者使用tar的-Z参数直接调用compress。 此外,需要检查是否有常见的错误或注意事项。例如,某些系统可能默认没有安装相关工具,需要提示用户安装。另外,解压时如果文件已存在,可能需要覆盖选项,或者处理文件名的问题。 最后,根据用户提供的引用内容,虽然主要是关于7z其他格式的解压策略设计,但用户现在的问题是关于.Z文件,所以可能需要忽略那些引用,除非有相关的内容。不过引用中提到策略模式处理不同压缩格式,可能可以建议用户如果需要编程处理.Z文件,可以考虑类似的策略模式,但用户的问题更偏向于工具方法,所以可能不需要深入设计模式部分。 总结步骤: 1. 解释.Z文件的背景常见工具。 2. 提供Linux下使用compress/uncompressgzip的命令示例。 3. 提供Windows下使用7-Zip或PeaZip的步骤。 4. 提到多文件处理需要结合tar。 5. 注意事项,如安装工具覆盖文件的问题。 6. 可能给出编程处理的建议,如使用Qt或Java的库,但用户的问题可能更关注命令行工具。 需要确保所有命令正确,语法正确,比如compressuncompress的参数是否正确,gzip的用法是否正确。例如,gzip -d可以解压.Z文件,而gzip -n可以生成.Z文件? 可能需要验证这些命令的实际效果,避免提供错误信息。例如,compress命令生成.Z,而uncompress解压。而gzip默认生成.gz,但通过参数可以处理.Z? 此外,需要注意.Z文件可能存在的兼容性问题,比如较新的系统可能不再默认支持,需要安装额外的包。</think>### .Z文件压缩解压方法 #### 一、Z文件格式简介 .Z文件是Unix系统中通过`compress`命令生成的压缩文件,采用LZW算法[^1]。其特点为单文件压缩,适用于早期Unix环境,目前逐渐被gzip替代。 #### 二、Linux/Unix系统操作 ##### 1. 压缩文件 ```bash compress -v filename # 生成filename.Z gzip -n -S .Z filename # 使用gzip生成.Z文件 ``` ##### 2. 解压文件 ```bash uncompress filename.Z # 输出原始文件 gunzip -S .Z filename.Z # 使用gunzip解压 ``` ##### 3. 多文件/目录处理 需结合`tar`打包: ```bash tar cvf files.tar dir/ # 打包目录 compress files.tar # 生成files.tar.Z ``` #### 三、Windows系统工具 1. **7-Zip** - 右键选择`.Z`文件 → "7-Zip" → "解压到当前文件夹" - 压缩时需通过命令行调用: ```powershell 7z a -tzip -mm=Deflate filename.Z inputfile ``` 2. **PeaZip** 支持图形化解压`.Z`文件,操作7-Zip类似。 #### 四、编程实现示例 ##### Python使用zlib库 ```python import zlib # 解压.Z文件 with open("file.Z", "rb") as f: data = zlib.decompress(f.read(), -zlib.MAX_WBITS) ``` ##### Qt/C++调用系统命令 ```cpp QProcess::execute("uncompress", QStringList() << "file.Z"); ``` #### 五、注意事项 1. **工具安装** Linux需安装`ncompress`包: ```bash sudo apt-get install ncompress ``` 2. **覆盖文件** 解压时添加`-f`参数强制覆盖: ```bash uncompress -f filename.Z ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值