【发布时间】:2017-11-17 20:44:22
【问题描述】:
我有很大的char* 对象。当我将此数组写入文件时,此文件的大小为 63.7 MB。我像这样从这个对象收到QByteArray 对象
QByteArray outputDataByteArray(outputData, outputSize);
如果我尝试将此对象发送为QString 参数,我会收到
传递给 C 运行时函数的参数无效。
在调试时我注意到它在以这个数组作为输入参数调用函数后崩溃,但没有出现在这个函数中。
我试过这样的
outputDataByteArray.append("\0");
根据文档信息,
警告:使用
fromRawData()创建的字节数组不是以空值结尾的,除非原始数据在位置大小处包含 0 字符。虽然这对于QDataStream或indexOf()之类的函数无关紧要,但将字节数组传递给一个接受const char *的函数,该函数应该是'\0'-terminated。
但这对我没有帮助。
在小尺寸数据上一切正常。
版本:
这是我收到的一些函数 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();
}
}
【问题讨论】:
-
请在您的问题中发布您的代码。
-
我编辑了我的问题
-
LZ4_decompress_safe_withPrefix64k的签名是什么?我猜但是......如果它是一个“C”函数并且应该分配给outputData,那么第二个参数不应该是&outputData吗? -
documentation 建议由调用者为
outputData分配内存在调用LZ4_decompress_safe_withPrefix64k之前。 -
对不起,我是这个网站的新手。我编辑了我的问题,我正在为输出对象分配内存