【发布时间】:2014-08-17 19:34:49
【问题描述】:
我有以下代码在调用错误时失败:
qUncompress: could not allocate enough memory to uncompress data
代码:
QString decStage3 ( QByteArray s )
{
printf ( "3a: length in %d\n", s.length());
QByteArray bData = 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());
}
示例输入是“789C0B492D2E5170492C490400101E033B”(==“测试数据”)。
更新:根据切尔诺贝利的建议,我决定添加如下直接测试:
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),但是有没有办法避免这样做?
【问题讨论】:
-
你把这个函数称为 decStage3(qCompress(arr)) 吗? (您在调用函数之前是否压缩数据?)如果您不压缩数据,请尝试执行此操作。也许在这之后你会得到 qUncompress: Z_DATA_ERROR: Input data is corrupted 错误???
-
数据很好,因为它来自另一个压缩程序。如果我遗漏一个字节,我会得到无效数据错误,所以我相信数据是正确的。
-
@TenG 我也遇到过类似的问题,解决方法是直接在 DEFLATEd 流上使用 tinfl 或 zlib。也可能是标题的问题,它是前置的。
-
@user1095106 - 谢谢,这应该给我一个出路。是否有直接在 zlib 中执行上述操作的示例?我得到了
和“JlCompress.h”的#includes。 -
这个问题似乎是题外话,因为它是关于
qUncompress的一个明确记录的方面。
标签: qt memory-management zlib