2016-04-05 6 views
0

У меня есть проблема с распаковкой zlib и Qt. У меня есть видеоданные, представленные протоколом Asterix Cat 240 (данные передачи радиолокационных данных), которые должны быть сжаты с помощью zlib. я хранятся данные внутри QByteArray и попытался извлечь его так:Decompress 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), но он всегда возвращает ложь, и я не знаю, почему.

Пример данные:

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

Что «я» в вашей петле? – Ilya

+0

@Ilya это просто счетчик для моего оригинального QByteArray, так как мой буфер содержит больше данных, чем только сжатые видеоданные – honiahaka10

ответ

2

Поскольку вы пытаетесь распаковывать поток ZLIB с GZIP декомпрессором. Это две разные вещи. Если вы измените второй аргумент inflateInit2 на 15 (вместо 15 + 16), тогда он должен работать.

Также у вас есть пять посторонних нулевых байтов после конца потока zlib. Это не приведет к сбою, но эти пять байтов останутся неиспользованными.

+0

Спасибо, что работает! Конечно, сейчас я не могу сказать, но, по крайней мере, сейчас данные имеют смысл. Что делает '+ 16' в этом коде? У вас может быть ссылка или что-то еще, где я могу понять, что делает код в деталях? Посторонние нулевые байты заполняются протоколом Asterix, поэтому у меня всегда есть те же самые соображения относительно того, сколько рангов я получаю от радара. – honiahaka10

+2

«+ 16» - это опция, которая сообщает 'inflate()' декодировать gzip-обертку вместо оболочки zlib. Это не удивительно, что в документации [zlib] (http://www.zlib.net/manual.html). –