2016-04-05 183 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)中有记录,这并不奇怪。 –