Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt-qUncompress-giving“;无法分配足够的内存来解压缩数据“;_Qt_Memory Management_Zlib - Fatal编程技术网

Qt-qUncompress-giving“;无法分配足够的内存来解压缩数据“;

Qt-qUncompress-giving“;无法分配足够的内存来解压缩数据“;,qt,memory-management,zlib,Qt,Memory Management,Zlib,我有以下代码,调用时出错: qUncompress: could not allocate enough memory to uncompress data 代码: 示例输入为“789C0B4929D2E5170492C4904000101E033B”(=“测试数据”) 更新:根据切尔诺贝利的建议,我决定添加直接测试,如下所示: void tst ( QByteArray b0 ) { QByteArray b1 = qCompress (b0); printf ( "[%s]

我有以下代码,调用时出错:

qUncompress: could not allocate enough memory to uncompress data
代码:

示例输入为“789C0B4929D2E5170492C4904000101E033B”(=“测试数据”)

更新:根据切尔诺贝利的建议,我决定添加直接测试,如下所示:

void tst ( QByteArray b0 )
{
    QByteArray b1 = qCompress (b0);
    printf ( "[%s] %d = [%s] %d\n", qPrintable(b0), b0.length(), qPrintable(b1.toHex()), b1.length());
    QByteArray b2 = qUncompress (b1);
    printf ( "uncomp = [%s]\n", qPrintable(b2));
}
然后测试:

tst ("Hello");
tst ("Hello World");
tst ("Hello World Nice To See You");
这就产生了以下结果:

[Hello] 5 = [00000005789cf348cdc9c90700058c01f5] 17
uncomp = [Hello]
[Hello World] 11 = [0000000b789cf348cdc9c95708cf2fca490100180b041d] 23
uncomp = [Hello World]
[Hello World Nice To See You] 27 = [0000001b789cf348cdc9c95708cf2fca4951f0cb4c4e5508c957084e4d5588cc2f050082f70939] 39
uncomp = [Hello World Nice To See You]
请注意,前8个字节现在显示为保留原始字符串的长度(十六进制)。我以前从未见过这种行为。我可以修改源程序以包含这一点(来自另一个系统,Java),但有没有办法避免这样做?

通过在zip数据之前预加一个虚拟长度(从789c开始),修复了(或者让它工作):


这是我声明bData的行,在它前面加上“00004000”。计算结果为16K。结果表明,虽然在压缩时,这表示未压缩数据的长度,但在未压缩时,它实际上不需要是准确的长度。因此,假设这更多地与内部用于解压的内存抓取有关,我选择16K,因为这对于我们期望的数据来说已经足够了。

您是否像decStage3(qCompress(arr))一样调用此函数?(在调用函数之前是否压缩数据?)。也许在这之后你得到了qUncompress:Z_DATA_ERROR:Input DATA is corrupt ERROR???数据很好,因为它来自另一个压缩程序。如果我漏掉一个字节,我会得到无效数据错误,因此我相信数据是正确的。@TenG我也遇到过类似的问题,解决方法是直接在放气流上使用tinfl或zlib。也可能是标题有问题,它是预先加好的。@user1095106-谢谢,这应该给我一个解决办法。是否有在zlib中直接执行上述操作的示例?我得到了#includes for和“JlCompress.h”。这个问题似乎离题了,因为它是关于
qUncompress
的一个明确的文档方面。这是有文档记录的:注意:如果要使用此函数解压缩使用zlib压缩的外部数据,首先需要在包含数据的字节数组中预先添加一个四字节头。标头必须包含未压缩数据的预期长度(以字节为单位),以无符号、大端、32位整数表示。”
[Hello] 5 = [00000005789cf348cdc9c90700058c01f5] 17
uncomp = [Hello]
[Hello World] 11 = [0000000b789cf348cdc9c95708cf2fca490100180b041d] 23
uncomp = [Hello World]
[Hello World Nice To See You] 27 = [0000001b789cf348cdc9c95708cf2fca4951f0cb4c4e5508c957084e4d5588cc2f050082f70939] 39
uncomp = [Hello World Nice To See You]
QString decStage3 ( QByteArray s )
{
    printf ( "3a: length in %d\n", s.length());
    QByteArray bData = QByteArray::fromHex("00004000") + QByteArray::fromHex(s );
    printf ( "3b: length ba %d\n", bData.length());
    printf ( "3c: ba [%s]\n", qPrintable(bData.toHex()));
    printf ( "3d: mem [%d]\n", bData.capacity() );

    QByteArray dS = qUncompress( bData );
   // QByteArray::fromHex(s.toLatin1());
    return (dS.data());
}