[英]Qt C++ QString to QByteArray Conversion
我创建了一个加密/解密程序,加密时我将加密的 QByteArray 存储在一个文本文件中。
尝试解密时,我检索了它,然后将其放入解密方法中,问题是我需要一种方法将其转换为 QByteArray而不更改格式,否则将无法正确解密。 我的意思是,如果文件给了我一个 1234 的加密值,我通过1234.toLatin1()
它转换为 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;
我想你应该使用:
QString::fromUtf8(const QByteArray &str)
要么:
QString::QString(const QByteArray &ba)
将QByteArray转换为QString,然后通过QTextStream将其写入文件。
之后,通过QTextStream读取文件,使用:
QString::toUtf8()
将QString转换为QByteArray。
QString :: QString(const QByteArray&ba)
构造一个用字节数组ba初始化的字符串。 使用fromUtf8()将给定的字节数组转换为Unicode。
PS:也许使用QFile :: write和QFile :: read是一种更好的方法。
尝试使用toLocal8Bit()..它适用于我
有一个简单的方法:
QByteArray ba;
QString qs = "String";
ba += qs;
更难的方法:
QByteArray ba;
QDataStream in(&ba, QIODevice::WriteOnly);
in << QString("String");
极端方式,对于想要使用 QBuffer 的人:
#include <QDebug>
#include <QBuffer>
#include <QDataStream>
#include <QIODevice>
#include <QByteArray>
#include <QString>
#include <qcoreapplication.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QByteArray byteArray;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::ReadWrite);
QDataStream in( &buffer );
in << QString("String");
buffer.close();
for (int i = 0; i < byteArray.length(); ++i) {
printf("%c - %x\n", byteArray.at(i), byteArray.at(i));
}
printf("\n");
return a.exec();
}
谁跑了最后的代码可以问我空字节从哪里来?
QDataStream
将QString
序列化为 little-endian。 读取 4 个字节以创建 32 位长度值,然后是 UTF-16 格式的字符串本身。 UTF-16 中的这个字符串长度是 12 个字节,所以QByteArray
的前三个字节将为零。
qDebug ()
读取QByteArray
经常会出现问题,记录就好了。 不要忘记删除.pro
文件中的QT_NO_CAST_FROM_BYTEARRAY
,如果它有
或者简单地使用b64 = data.toUtf8().toBase64();
首先使用toUtf8()
将其转换为QByteArray ,然后立即将其转换为toBase64()
如果我理解正确,文件中的文本将存储在QString内容中。 我想你可以创建一个新的QByteArray。 因为QByteArray的构造函数不允许将QString作为输入,所以我可能必须将QString附加到空QByteArray。
//After if:
QByteArray tempContent();
tempContent.append(content);
QByteArray decrypted = crypto.Decrypt(tempContent, key);
我在Qt库中没有太多经验,但我希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.