Qt小技巧18.解決"qUncompress: Z_DATA_ERROR: Input data is corrupted"問題

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;
}

好了,解決了,如果出現類似問題,解決的思路應該都差不多,一定要保證讀寫方式的一致性,這是問題的關鍵所在。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章