2

我正在做一个项目,我需要将一个字符串(QString)作为二进制写入(并在未来读取)。该字符串是十六进制格式,例如“00010203040506070a0f01”等...

我通过 YouTube 上的教程了解了这一点:

void Output()
{
    QString ye("01020a");
    QFile file("C:\\Users\\Public\\Documents\\Qt_Projects\\myfile.dat";

    if(!file.open(QIODevice::WriteOnly))
    {
        qDebug() << "Could not open file to be written";
        return;
    }

    QDataStream out(&file);
    out.setVersion(QDataStream::Qt_5_0);

    out << ye;

    file.flush();
    file.close();
   }

但是当我用十六进制编辑器打开“myfile.dat”时,十六进制值不同,QString“ye”被写入了事物的文本端。

00 00 00 0C 00 30 00 31 00 30 00 32 00 30 00 61

帮助?

4

3 回答 3

7

你应该在写之前转换它。

QByteArray array = QByteArray::fromHex(ye.toLatin1());
file.write(array);

你不需要使用QDataStream,因为你已经拥有QByteArray并且可以直接编写它。

您可以读取数据并将其转换回十六进制表示,如下所示:

QString s = file.readAll().toHex();
于 2013-07-11T20:34:07.340 回答
1

在 QString 中,每个字符占用 2 个字节(使用 unicode)。您可以查阅 ascii 表以在 hex int 中搜索字符的代码值:

'0': 0x30
'1': 0x31
'a': 0x61

所以对于字符串,"01020a"它的 ascii 代码序列是:00 30 00 31 00 30 00 32 00 30 00 61

"00 00 00 0C":我认为这是 QString 的类型标识。

抱歉我的表达不佳,希望它有用。

于 2013-07-12T06:52:04.570 回答
0

将 QString 保存到 QFile;

QString qStr="abc";
qFile.write(qStr.toUtf8().constData());

conversion sequences are here;
   QString => QByteArray => const char* => QFile.write()

[参考类功能]

QByteArray QString::toUtf8() const;
const char * QByteArray::constData() const;
qint64 QIODevice::write(const char * data);
于 2016-03-09T02:17:44.273 回答