不能使用大尺寸的QByteArray作为QString

时间:2017-06-15 11:14:26

标签: c++ qt

我有一个很大的char*对象。当我将此数组写入文件时,此文件的大小为63.7 MB。我从这个对象收到QByteArray对象,如此

QByteArray outputDataByteArray(outputData, outputSize);

如果我尝试将此对象作为QString参数发送,我会收到

  

传递给C运行时函数的参数无效。

在调试时我注意到在使用此数组作为输入参数调用函数后它崩溃了,但是没有进入此函数。

我试过这样的事情

outputDataByteArray.append("\0");

根据文件信息,

  

警告:使用fromRawData()创建的字节数组不以空值终止,除非原始数据在位置大小中包含0个字符。虽然这对QDataStreamindexOf()等函数无关紧要,但将字节数组传递给接受const char *预期为'\0'的函数 - 终止将失败。

但它对我没有帮助。

对于小尺寸的数据,一切正常。

版:

这是我在其中收到QBytearray的一些功能(一切正常):

uncompress(const QByteArray &inputByteArray, bool *ok)
{
if (ok != NULL)
    *ok = false;

const char *inputData = inputByteArray.data();

char *outputData = NULL;
qint64 outputSize   = 0;

for (int i = 0; i < CHUNK_COUNT_MAX; i++)
{
    const int outputSizeMax = CHUNKSIZE * (i + 1);
    outputData = new char[outputSizeMax];


    outputSize = LZ4_decompress_safe_withPrefix64k(inputData, outputData, inputByteArray.length(), outputSizeMax);

    if (outputSize < 0)
    {
        delete [] outputData;
        outputData = NULL;
    }
    else
    {
        break;
    }
}

if (outputData == NULL)
    return QByteArray();

QFile file("C:/Users/HOME/file.txt");
if(file.open(QIODevice::WriteOnly))
{
    file.write(outputData, outputSize);
}
file.close();

QByteArray outputDataByteArray(outputData, outputSize);

outputDataByteArray.append("\0");

delete [] outputData;

if (ok != NULL)
    *ok = true;

return outputDataByteArray;

}

但是,如果我尝试使用此数组作为参数调用另一个函数:

parse(outputDataByteArray, ok);

我收到了上面写的内容。

增加: 它没有出现在这个函数中,而是我发送QByteArray作为参数的函数的定义:

parse(const QString &json, bool &success)
{
    success = true;
    if(!json.isNull() || !json.isEmpty())
    {
            QString data = json;

            int index = 0;


            QVariant value = Json::parseValue(data, index, success);


            return value;
    }
    else
    {
        return QVariant();
    }
}

1 个答案:

答案 0 :(得分:0)

您正在呼叫LZ4_decompress_safe_withPrefix64k

char *outputData = NULL;

而且,这个函数的定义是这样的:

int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize)
{
    return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB);
}

而且,LZ4_decompress_generic的定义没有任何输出缓冲区的分配代码。请参阅LZ4_decompress_generic的{​​{3}}。

它只是在line # 1129中进行了类型转换:

BYTE* op = (BYTE*) dest;

并且,在整个该功能的定义中进一步使用它,例如memcpyLZ4_wildCopyLZ4_copy8

因此,它是输出缓冲区指针指向的无效内存。您需要在将内存传递给函数之前分配它的内存。除此之外,您还需要在将指针传递给其他函数之前对其进行验证。您可以使用assertsif检查来验证这一点。

希望这会有所帮助。