2016-06-14 223 views
7

我已经创建了一个加密/解密程序,加密时我将加密的QByteArray存储在一个文本文件中。试图解密时,我检索它,然后将其放入解密方法,问题是我需要一种方法将其转换为QByteArray,而不更改格式,否则它不会正确解密,我的意思是,如果该文件给了我一个加密的值为1234,我将它转换为QByteArray,通过执行1234.toLatin1()它改变了值并且解密不起作用。有什么建议么?Qt C++ QString到QByteArray的转换

我的代码

QFile file(filename); 
    QString encrypted; 
    QString content; 

    if (file.open(QIODevice::ReadOnly)) { 
     QTextStream stream(&file); 
     content = stream.readAll(); 
    } 

    encrypted = content.replace("\n", ""); 

    qDebug() << encrypted; // Returns correct encrypted value 

    QByteArray a; 
    a += encrypted; 

    qDebug() << "2 " + a; // Returns different value than previous qDebug() 

    QByteArray decrypted = crypto.Decrypt(a, key); 
    return decrypted; 
+0

是怎么写的QByteArray到文本文件?使用QTextStream或只使用一个QFile ::写? – Daniel

+0

@Daniel QTextStream – James

回答

13

我猜你应该使用

QString::fromUtf8(const QByteArray &str) 

QString::QString(const QByteArray &ba) 

到的QByteArray转换为QString的,然后通过QTextStream其写入文件。
Affter,通过QTextStream读文件,使用

QString::toUtf8() 

到的QString转换为QByteArray中。

的QString ::的QString(常量的QByteArray & BA)

构造具有字节数组BA初始化的字符串。给定的字节数组使用fromUtf8()转换为Unicode


PS: 也许使用一个QFile ::写入和一个QFile ::阅读是一种更好的方式。

+0

我宁愿直接使用QString :: fromUtf8而不是隐式QString <-> QByteArray转换,使明文数据和unicode之间的转换显式化,并声明假定的数据编码。 –

-2

如果我理解正确的话,从文件中的文本是在QString的内容存储库。我想你可以创建一个新的QByteArray。因为QByteArray的构造函数不允许QString作为输入,所以我可能需要将QString追加到空的QByteArray。

//After if: 
QByteArray tempContent(); 
tempContent.append(content); 
QByteArray decrypted = crypto.Decrypt(tempContent, key); 

我没有太多的Qt库经验,但我希望这有助于。

+0

这确实转换成功,但经过测试后返回'?\ x01?YJ?l?p3&?\ x11 \ x1Bv /?X ?? c?U?〜{?a ??',它应该是' ?\ u0001?YJ?l?p3&?\ u0011 \ u001Bv /?X ?? c?U?〜{?a ??'为什么值可能会改变?因为我在创建'QByteArray'之前使用了qDebug()和'content'是正确的值 – James

+0

我已经编辑了我的帖子并添加了我的整个函数,如果有帮助 – James

+0

不知道为什么这会降低效果,这很好。 – Zimano

1

尝试使用toLocal8Bit()..它正常工作与我