zlib压缩数据格式解析及解压方法(含qCompress()生成文件的扩展名与CLI工具推荐)
2. qCompress()生成文件的扩展名与CLI解压工具
这里要划个重点:qCompress()的输出不是纯标准zlib格式——它会在zlib压缩数据的最前面添加一个4字节的无符号整数,用来存储原始数据的未压缩大小(方便qUncompress()快速恢复)。这个额外的头部会导致直接用标准zlib工具解压失败。
方案一:生成标准可直接解压的文件(推荐)
如果要让文件能被标准工具直接识别解压,你需要修改代码,跳过qCompress()输出的前4字节,只写入后面的纯zlib数据流。比如在Qt中:
QByteArray rawData = readFileContent(); // 读取原始文件内容 QByteArray compressed = qCompress(rawData); // 跳过前4字节的大小标识,写入纯zlib数据 QFile output("data.zlib"); output.open(QIODevice::WriteOnly); output.write(compressed.mid(4)); output.close();
这种情况下,推荐用**.zlib或.zz**作为扩展名(.z也可以,但容易和旧的compress格式混淆),解压工具就用上面提到的zlib-flate、openssl、Python或7-Zip即可。
如果想让文件兼容性更强(比如让gunzip也能直接处理),可以把纯zlib数据封装成gzip格式(添加gzip的头部和尾部),这时用**.gz**作为扩展名,就能用gunzip data.gz或gzip -d data.gz直接解压了。
方案二:解压已生成的qCompress格式文件
如果已经有了带4字节Qt头部的文件,需要先剥离头部再解压:
- 在Linux/macOS上用
tail工具快速剥离:# 剥离前4字节,得到纯zlib数据 tail -c +5 input.qz > input.zlib # 用zlib工具解压处理后的文件 zlib-flate -uncompress < input.zlib > output_file - 在Windows PowerShell上的处理方式:
Get-Content input.qz -Raw | Select-Object -Skip 4 | Set-Content -NoNewline input.zlib zlib-flate -uncompress < input.zlib > output_file
这种带Qt头的文件可以用自定义扩展名比如**.qz**来标识,但标准工具无法直接处理,必须先剥离头部才能解压。
内容的提问来源于stack exchange,提问作者iammilind
相关产品推荐
相关产品推荐

