所以我必须浏览一个我要加密/解密的大文件。
我不能直接加密/解密整个文件,所以我按块进行加密。
它适用于加密但由于某种原因它在解密部分崩溃并在尝试将第255个数据块写入输出设备后抛出“std :: bad_alloc”。
以下是代码:
bool CryptEngine::decryptByChunk(QtAES256& cryptEngine, QIODevice& source, QIODevice& dest, int chunkSize)
{
while(source.bytesAvailable() > chunkSize)
{
QByteArray inputBuffer;
QByteArray decryptedData;
inputBuffer = source.read(chunkize);
if (cryptEngine.decrypt(inputBuffer, decryptedData, CryptoPP::StreamTransformationFilter::NO_PADDING))
{
dest.write(decryptedData);
}
else return false;
}
// ...
// Some other operations...
// ...
}
这里chunkSize是1 MB。
抛出异常的行是第255次迭代的 dest.write(decryptedData); 。
有人可以解释一下这种行为吗?
修改:
用于填充decryptedData的方法
bool QtAES256::decrypt(const QByteArray& cryptedArray, QByteArray& decryptedArray, CryptoPP::StreamTransformationFilter::BlockPaddingScheme padding)
{
decryptedArray.clear();
//...
decryptedArray.append(decryptedResult, arraySink->TotalPutLength());
//...
}
其中decryptedResult是char *
答案 0 :(得分:0)
我发现了使用VMMap的问题,这是我在Waxrat建议之后下载的工具。
我可以看到在调用CryptEngine::decryptByChunk
后堆内存消耗量爆炸了。
事实上,我正在写一个位于堆上的QBuffer
(我认为它是QFile
)。
因此,当缓冲区大小超过256 MB时,系统似乎找不到足够大的连续块来分配和返回std::bad_alloc
。