【问题标题】:Qt C++ QString to QByteArray ConversionQt C++ QString 到 QByteArray 的转换
【发布时间】:2016-10-14 15:05:40
【问题描述】:

我创建了一个加密/解密程序,加密时我将加密的 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;

【问题讨论】:

  • 你是如何将 QByteArray 写入文本文件的?使用 QTextStream 还是只使用 QFile::write?
  • @Daniel QTextStream

标签: c++ qt qstring qbytearray


【解决方案1】:

我猜你应该使用:

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 是更好的方法。

【讨论】:

  • 我宁愿直接使用 QString::fromUtf8 而不是隐式的 QStringQByteArray 转换,以使纯数据和 unicode 之间的转换显式并声明数据的假定编码。跨度>
  • 这与标题所说的相反,对于查找类似问题的人来说......
【解决方案2】:

尝试使用 toLocal8Bit() .. 它适用于我

【讨论】:

    【解决方案3】:

    有一个简单的方法:

       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 序列化为小端序。读取 4 个字节以创建 32 位长度值,然后是 UTF-16 中的字符串本身。 UTF-16 中的这个字符串长度是 12 个字节,所以QByteArray 中的前三个字节将为零。

    qDebug ()中读取QByteArray经常会出现问题@录音很好。 不要忘记删除.pro 文件中的QT_NO_CAST_FROM_BYTEARRAY(如果有)

    【讨论】:

      【解决方案4】:

      或者干脆选择b64 = data.toUtf8().toBase64();

      先用toUtf8()将其转换为QByteArray,然后立即将其转换为toBase64()

      【讨论】:

        【解决方案5】:

        如果我理解正确,文件中的文本存储在 QString 内容中。我认为您可以创建一个新的 QByteArray。因为 QByteArray 的构造函数不允许 QString 作为输入,我可能不得不将 QString 附加到空的 QByteArray。

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

        我在 Qt 库方面没有太多经验,但我希望这会有所帮助。

        【讨论】:

        • 这确实转换成功,但测试后返回?\x01?YJ?l?p3&amp;?\x11\x1Bv/?X??c?U?~{?a??,应该是?\u0001?YJ?l?p3&amp;?\u0011\u001Bv/?X??c?U?~{?a?? 为什么值会改变?因为我在创建 QByteArray 之前使用了 qDebug() 和 content 是正确的值
        • 我已经编辑了我的帖子并添加了我的整个功能(如果有帮助的话)
        • 不知道为什么会有反对票,这很好。
        猜你喜欢
        • 1970-01-01
        • 2016-11-27
        • 1970-01-01
        • 2017-12-18
        • 2017-12-12
        • 2013-10-16
        • 2012-12-17
        • 2012-07-02
        • 2017-08-31
        相关资源
        最近更新 更多