如何在 Qt 5.3 中将 QByteArray 转换为字符串?
How can I convert QByteArray to string in Qt 5.3?
我正在使用一些函数将 QVector's
转换为 QByteArray's
,例如:
QByteArray Serialize::serialize(QVector<double> data)
{
QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
out << data;
return byteArray;
}
void Serialize::deserialize(QByteArray byteArray, QVector<double> *data)
{
QDataStream in(&byteArray, QIODevice::ReadOnly);
in >> *data;
}
现在,我有 QByteArray
,我需要将其放入文本文件,如何将其转换为 QString
?
我已经尝试过最简单的方法:
QString myString(data); // data - QByteArray
但是myString
总是空的。
我在文档中也找到了toStdString()
函数,不过是在Qt 5.4.
中才引入的
我正在使用 Qt 5.3。
下面是一个完整的例子:
#include <QCoreApplication>
#include <QDebug>
#include <QVector>
#include <QByteArray>
#include <QDataStream>
QByteArray serialize(QVector<double> data)
{
QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
out << data;
return byteArray;
}
void deserialize(QByteArray byteArray, QVector<double> *data)
{
QDataStream in(&byteArray, QIODevice::ReadOnly);
in >> *data;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QVector<double> data;
data << 1.1 << 2.2 << 3.3 << 4.4 << 5.5 << 6.6 << 7.7 << 8.8 << 9.9;
QByteArray byteArray = serialize(data);
QVector<double> dataConverted;
deserialize(byteArray, &dataConverted);
qDebug() << "Data:";
qDebug() << data;
qDebug() << "ByteArray:";
QString test(byteArray);
qDebug() << test;
qDebug() << "Data Converted:";
qDebug() << dataConverted;
return a.exec();
}
注意:这里的一般objective是生成一个SQL文件,所有内容来自SQLite 数据库。我的双向量被转换为 QByteArray
并作为 BLOB 存储到数据库中(使用序列化函数)。当我需要从数据库加载它时,我使用反序列化函数再次转换为双向量。现在我需要用SQL格式的数据生成BLOB格式的文件,然后我可以直接将它导入到另一个数据库中。
问题在于字节数组是 type-agnostic 数据类型,它只是表示内存中单个字节的集合。在您的示例代码中,您从一个双精度向量创建字节数组,然后转换回另一个双精度向量。没问题。
但是,当您将字节数组传递给 QString 构造函数时,QString 会尝试将字节数组解释为表示字符串的数据,例如 ASCII 字符代码数组。
一些字符串 类 可能会让你这样做,并创建一个充满垃圾的实例,但是 QString 似乎正在做一些基本的错误检查并通过给你一个空字符串来帮助你。
至于一些打印出双精度字节数组内容的代码,您提供的反序列化方法就是一个不错的例子。
使用QTextCodec
从QByteArray
转换为QString
,这里是official docs的例子:
QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
为了使示例正常工作,您需要在序列化期间将双精度数转换为 QString
s:
QByteArray serialize(QVector<double> data)
{
QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
for (double d : data) {
out << QString::number(d);
}
return byteArray;
}
如果您不想将单个数字转换为字符串,您还可以 "stringify" QByteArray
和 byteArray.toHex()
:
qDebug() << "ByteArray:";
QString test(byteArray.toHex());
我正在使用一些函数将 QVector's
转换为 QByteArray's
,例如:
QByteArray Serialize::serialize(QVector<double> data)
{
QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
out << data;
return byteArray;
}
void Serialize::deserialize(QByteArray byteArray, QVector<double> *data)
{
QDataStream in(&byteArray, QIODevice::ReadOnly);
in >> *data;
}
现在,我有 QByteArray
,我需要将其放入文本文件,如何将其转换为 QString
?
我已经尝试过最简单的方法:
QString myString(data); // data - QByteArray
但是myString
总是空的。
我在文档中也找到了toStdString()
函数,不过是在Qt 5.4.
我正在使用 Qt 5.3。
下面是一个完整的例子:
#include <QCoreApplication>
#include <QDebug>
#include <QVector>
#include <QByteArray>
#include <QDataStream>
QByteArray serialize(QVector<double> data)
{
QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
out << data;
return byteArray;
}
void deserialize(QByteArray byteArray, QVector<double> *data)
{
QDataStream in(&byteArray, QIODevice::ReadOnly);
in >> *data;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QVector<double> data;
data << 1.1 << 2.2 << 3.3 << 4.4 << 5.5 << 6.6 << 7.7 << 8.8 << 9.9;
QByteArray byteArray = serialize(data);
QVector<double> dataConverted;
deserialize(byteArray, &dataConverted);
qDebug() << "Data:";
qDebug() << data;
qDebug() << "ByteArray:";
QString test(byteArray);
qDebug() << test;
qDebug() << "Data Converted:";
qDebug() << dataConverted;
return a.exec();
}
注意:这里的一般objective是生成一个SQL文件,所有内容来自SQLite 数据库。我的双向量被转换为 QByteArray
并作为 BLOB 存储到数据库中(使用序列化函数)。当我需要从数据库加载它时,我使用反序列化函数再次转换为双向量。现在我需要用SQL格式的数据生成BLOB格式的文件,然后我可以直接将它导入到另一个数据库中。
问题在于字节数组是 type-agnostic 数据类型,它只是表示内存中单个字节的集合。在您的示例代码中,您从一个双精度向量创建字节数组,然后转换回另一个双精度向量。没问题。
但是,当您将字节数组传递给 QString 构造函数时,QString 会尝试将字节数组解释为表示字符串的数据,例如 ASCII 字符代码数组。
一些字符串 类 可能会让你这样做,并创建一个充满垃圾的实例,但是 QString 似乎正在做一些基本的错误检查并通过给你一个空字符串来帮助你。
至于一些打印出双精度字节数组内容的代码,您提供的反序列化方法就是一个不错的例子。
使用QTextCodec
从QByteArray
转换为QString
,这里是official docs的例子:
QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
为了使示例正常工作,您需要在序列化期间将双精度数转换为 QString
s:
QByteArray serialize(QVector<double> data)
{
QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
for (double d : data) {
out << QString::number(d);
}
return byteArray;
}
如果您不想将单个数字转换为字符串,您还可以 "stringify" QByteArray
和 byteArray.toHex()
:
qDebug() << "ByteArray:";
QString test(byteArray.toHex());