1 引言
Qt 中的 qCompress() 和 qUncompress() 函數來進行 QByteAarray 的壓縮和解壓操作。這些函數提供了方便的方式來對字節數組進行壓縮和解壓縮,無需處理底層的壓縮算法和細節。但是在使用過程中有時候會遇到一些棘手的問題,例如下面這個例子:
2 錯誤案例
下面是一個錯誤示例:
#include <QByteArray>
#include <QFile>
#include <QDataStream>
int main()
{
QByteArray originalData = "Hello, Hello, Hello, This is a test for compression and decompression.";
// 壓縮數據
QByteArray compressedData = qCompress(originalData, 9); // 9 爲壓縮級別
// 寫入文件
QFile wFile("test.dat");
wFile.open(QIODevice::WriteOnly);
QDataStream wStream(&wFile);
wStream << compressedData;
wFile.close();
// 讀取文件
QFile rFile("test.dat");
rFile.open(QIODevice::ReadOnly);
compressedData = rFile.readAll();
rFile.close();
// 解壓數據
QByteArray uncompressedData = qUncompress(compressedData);
return 0;
}
此時會報錯:"qUncompress: Z_DATA_ERROR: Input data is corrupted",意味着解壓縮的輸入數據已損壞或有錯誤。
出錯的原因在於讀取文件的時候沒有用QDataStream流的方式讀取文件,而是使用了QFile::readAll,QDataStream寫文件的時候會加入“額外的信息”,如果不以QDataStream流的方式讀取文件,當然會導致數據錯誤,所以,讀寫文件一定要用同樣的方式。
3 正確案例
通過上面的分析,正確示例:
#include <QByteArray>
#include <QFile>
#include <QDataStream>
int main()
{
QByteArray originalData = "Hello, Hello, Hello, This is a test for compression and decompression.";
// 壓縮數據
QByteArray compressedData = qCompress(originalData, 9); // 9 爲壓縮級別
// 寫入文件
QFile wFile("test.dat");
wFile.open(QIODevice::WriteOnly);
QDataStream wStream(&wFile);
wStream << compressedData;
wFile.close();
compressedData.clear();
// 讀取文件
QFile rFile("test.dat");
rFile.open(QIODevice::ReadOnly);
QDataStream rStream(&rFile);
rStream >> compressedData;
rFile.close();
// 解壓數據
QByteArray uncompressedData = qUncompress(compressedData);
return 0;
}
好了,解決了,如果出現類似問題,解決的思路應該都差不多,一定要保證讀寫方式的一致性,這是問題的關鍵所在。