繁体   English   中英

Qt C++ QString 到 QByteArray 的转换

[英]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();
}

谁跑了最后的代码可以问我空字节从哪里来?

QDataStreamQString序列化为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM