Qt C++ 如何将加密文本的 QByteArray 保存到文件中,然后读取并格式化为 QByteArray
Qt C++ How to save QByteArray for encrypted text to a file, then read and format back as a QByteArray
我有一个非常简单的 encrypt/decrypt 程序。加密后我的程序 returns 将加密文本作为 QByteArray,然后将其保存到文本文件中。从文件中检索 ByteArray 进行解密时,我不确定它的格式是否正确,或者文件是否添加了某种额外的字符,例如 \n
这是我的 encrypt/decrypt 函数:
void Handler::updatePMEF(QString format) {
SimpleCrypt crypto(Q_UINT64_C(0x0c2ad4a4acb9f023));
QString result = crypto.encryptToByteArray(format);
QFile file("C:/test.txt");
if ( file.open(QIODevice::ReadWrite) ) {
QTextStream stream( &file );
stream << result << endl;
}
}
QString Handler::openPMEF() {
QByteArray encrypted;
QFile file("C:/test.txt");
if ( file.open(QIODevice::ReadOnly) ) {
encrypted = file.readAll();
}
SimpleCrypt crypto(Q_UINT64_C(0x0c2ad4a4acb9f023));
QString decrypted = crypto.decryptToByteArray(encrypted);
return decrypted;
}
在调用 openPMEF()
调试器后 returns 什么都没有,所以我假设出了什么问题。
在我尝试做 QByteArray = encrypted
之前希望它能转换并且调试器返回:
Decrypyted: ????\u00153C?????qW\f????\u00153\u0019????\u00153\u001C????\u0006 \u001C?????2\u0014\u001C????\f*v?????\u00153'?????\u0004\"~?D?\u0005?\u00153(???? \u0006\u001Cf???\u00153I?????dB2??\u00153\u001C????\u00153l?????-\u000B\u001C?????\u00153I?????\u00153\u001C????\u0018>\u001Cf???\u00153(?????jLa????\u00153\u0006?????\u001D;)????DbK????~X\u0010Ö???\u0001'\u001B?????rTl?????\u0005#Z????X~Q?????F`G???²\u001A<B???? \u0006G?????F`r????? \u0006
这很可能是因为您在写作时使用了 QTextStream
。例如,这个很可能会在第一个 OES ([=12=]
) 上停止,而您的加密数据可能包含很多。
你应该使用一个直接写成 QByteArray
的函数。
试试用这个写:
file.write( result.toAscii() );
我不确定你应该使用什么编码(这也可以解释它在你的代码中失败,如果 reading/writting enciding 是不同的。你可以尝试所有可用的:result.toLatin1()
,result.toLocal8Bit()
, result.toUtf8()
。希望一个能按预期工作。
顺便说一下,也许 QString 一开始就不适合存储您的数据。不能把SimpleCrypt::encryptToByteArray
改成return一个QByteArray
吗?
编辑: 正如离线讨论的那样,最终的解决方案是将 SimpleCrypt::encryptToByteArray
修改为 return a QByteArray
而不是 QString
(QString
用于存储字符串而不是字节数组)
我有一个非常简单的 encrypt/decrypt 程序。加密后我的程序 returns 将加密文本作为 QByteArray,然后将其保存到文本文件中。从文件中检索 ByteArray 进行解密时,我不确定它的格式是否正确,或者文件是否添加了某种额外的字符,例如 \n
这是我的 encrypt/decrypt 函数:
void Handler::updatePMEF(QString format) {
SimpleCrypt crypto(Q_UINT64_C(0x0c2ad4a4acb9f023));
QString result = crypto.encryptToByteArray(format);
QFile file("C:/test.txt");
if ( file.open(QIODevice::ReadWrite) ) {
QTextStream stream( &file );
stream << result << endl;
}
}
QString Handler::openPMEF() {
QByteArray encrypted;
QFile file("C:/test.txt");
if ( file.open(QIODevice::ReadOnly) ) {
encrypted = file.readAll();
}
SimpleCrypt crypto(Q_UINT64_C(0x0c2ad4a4acb9f023));
QString decrypted = crypto.decryptToByteArray(encrypted);
return decrypted;
}
在调用 openPMEF()
调试器后 returns 什么都没有,所以我假设出了什么问题。
在我尝试做 QByteArray = encrypted
之前希望它能转换并且调试器返回:
Decrypyted: ????\u00153C?????qW\f????\u00153\u0019????\u00153\u001C????\u0006 \u001C?????2\u0014\u001C????\f*v?????\u00153'?????\u0004\"~?D?\u0005?\u00153(???? \u0006\u001Cf???\u00153I?????dB2??\u00153\u001C????\u00153l?????-\u000B\u001C?????\u00153I?????\u00153\u001C????\u0018>\u001Cf???\u00153(?????jLa????\u00153\u0006?????\u001D;)????DbK????~X\u0010Ö???\u0001'\u001B?????rTl?????\u0005#Z????X~Q?????F`G???²\u001A<B???? \u0006G?????F`r????? \u0006
这很可能是因为您在写作时使用了 QTextStream
。例如,这个很可能会在第一个 OES ([=12=]
) 上停止,而您的加密数据可能包含很多。
你应该使用一个直接写成 QByteArray
的函数。
试试用这个写:
file.write( result.toAscii() );
我不确定你应该使用什么编码(这也可以解释它在你的代码中失败,如果 reading/writting enciding 是不同的。你可以尝试所有可用的:result.toLatin1()
,result.toLocal8Bit()
, result.toUtf8()
。希望一个能按预期工作。
顺便说一下,也许 QString 一开始就不适合存储您的数据。不能把SimpleCrypt::encryptToByteArray
改成return一个QByteArray
吗?
编辑: 正如离线讨论的那样,最终的解决方案是将 SimpleCrypt::encryptToByteArray
修改为 return a QByteArray
而不是 QString
(QString
用于存储字符串而不是字节数组)