2016-04-05 182 views
0

我無法用zlib和Qt解壓縮。 我有Asterix Cat 240協議(雷達視頻傳輸數據)提交的視頻數據,應該用zlib壓縮。 我存儲的數據QByteArray內,並試圖將其解壓這樣的:解壓縮Zlib

QByteArray compressedRawVideoDataBlock; 
QByteArray rawVideoDataBlock; 
QVector <QVector <quint8>> videoDataBlock; 
//Video Data 
resize(rawAsterix.videoDataBlockREP); 
for(int r = 0; r<videoDataBlockREP; r++)//index of Video Block 
{ 
    for(int b = 0; b<blockSize ; b++)//index of Video Byte 
    { 
     compressedRawVideoDataBlock.append(static_cast<quint8>(buffer->at(i))); 
     videoDataBlock[r].append(static_cast<quint8>(buffer->at(i))); 
     i++; 
    } 
} 
qDebug() << gzipDecompress(compressedRawVideoDataBlock, rawVideoDataBlock); 

用於提煉,我想這個功能(Zlib QCompressor),但它始終返回false,我不知道爲什麼。

示例數據:

videoDataBlockREP=1 
blockSize=64 
compressedRawVideoDataBlock.toHex() = 7801edd0010d000000c2a0f74f6d0e37884061c0800103060c183060c0800103060c183060c0800103060c183060c0800103060cbc0f0c200000010000000000 
+0

循環中有什麼「我」? – Ilya

+0

@Ilya它只是我的原始QByteArray的計數器,因爲我的緩衝區包含的數據多於壓縮的視頻數據 – honiahaka10

回答

2

因爲你試圖解壓了gzip解壓縮zlib的流。這是兩回事。如果將inflateInit2的第二個參數更改爲15(而不是15 + 16),那麼它應該可以工作。

另外,zlib流結束後還有五個無關的零字節。這不會導致失敗,但這五個字節將保持不被使用。

+0

謝謝你似乎工作!當然,我現在不能說真的,但至少現在的數據似乎是有道理的。 Whate在代碼中做了「+ 16」嗎?你可能有鏈接,或者我可以理解代碼詳細描述的內容嗎? 無關的零字節由Asterix協議填充,所以我總是擁有相同的塊大小來表示我從雷達中獲得了多少rangecell。 – honiahaka10

+2

'+ 16'是一個選項,它告訴'inflate()'解碼gzip包裝器而不是zlib包裝器。在[zlib文檔](http://www.zlib.net/manual.html)中有記錄,這並不奇怪。 –