Qt 如何从QString获取QByteArray?

Qt 如何从QString获取QByteArray?,qt,unicode,encoding,decoding,qstring,Qt,Unicode,Encoding,Decoding,Qstring,我试图了解QByteArray和QString在Qt中是如何协同工作的。我正在使用Qt5.9 在下面的例子中,我在内存中创建了一个QByteArray QByteArray qba; quint8 version = 1; qba << version; quint8 type = 122; qba << type; qDebug() << qba.length() << " " << QString(qba); 因此,我有2个字节

我试图了解
QByteArray
QString
在Qt中是如何协同工作的。我正在使用Qt5.9

在下面的例子中,我在内存中创建了一个
QByteArray

QByteArray qba;
quint8 version = 1;
qba << version;
quint8 type = 122;
qba << type;

qDebug() << qba.length() << " " << QString(qba);
因此,我有2个字节的数据,并提取了字符串表示

现在,我要做的是从字符串表达式(它作为原始C++字符数组)给我,并创建<代码> QByteArray < /Cult>表示。因此,我创建数组如下:

char msg[] = { '\\', 'u', '0', '0', '0', '1', 'z', '\0' };
QString testStr = QString::fromUtf8(msg);
QByteArray testRaw = testStr.toUtf8();
qDebug() << testRaw.length() << " " << QString(testRaw);

我不确定如何从这样的字符数组开始,并获得字节数组表示。我不确定这是否是字符串编码问题,但无论我尝试了哪种字符串方法(
fromLatin1
fromUtf16
等)

编码依赖于
QString
QByteArray
之间的转换,我都无法重新创建此二进制表示! 您的
QString(qba)
假设数据是UTF-8编码的,请参阅

在其他方面,您有:

等等,也有相反的静态方法。

请注意,
qDebug()在
QString
QByteArray
之间的转换取决于编码! 您的
QString(qba)
假设数据是UTF-8编码的,请参阅

在其他方面,您有:

等等,也有相反的静态方法。

请注意,
qDebug()感谢您的回答。所以,是的,我想QString(qba)给了我一个utf-8表示。因此,我尝试在内存中执行相同的操作(在代码的第二部分)。为什么我没能找回QByteArray?我认为行
qstringteststr=QString::fromUtf8(msg)将给我相同的表示。哪个版本的Qt?Qt4在这方面有不同的行为。是的,但转换后的QByteArray的长度不同,即2对7。因此,字符串表示中出现了一些错误。我使用qt 5.9第一次输出:
7”\\u0001z“
,所以这很好,在第二次输出中,您粘贴了一个执行转换的
qDebug
输出,所以您为什么感到惊讶?感谢您的回答。所以,是的,我想QString(qba)给了我一个utf-8表示。因此,我尝试在内存中执行相同的操作(在代码的第二部分)。为什么我没能找回QByteArray?我认为行
qstringteststr=QString::fromUtf8(msg)将给我相同的表示。哪个版本的Qt?Qt4在这方面有不同的行为。是的,但转换后的QByteArray的长度不同,即2对7。因此,字符串表示中出现了一些错误。我使用qt 5.9第一次输出:
7“\\u0001z”
,所以这很好,在第二次输出中,您粘贴了一个执行转换的
qDebug
输出,所以为什么您会感到惊讶?编辑后我刚刚发布了答案。现在我知道你的问题不准确。你为什么需要这个转换?你需要用它做什么?我需要这个转换,因为我使用一个库libdmtx来解码数据矩阵图像。解码器返回一个
常量char*
,我试图基本上得到二进制表示来解析它。我猜返回的字符串是UTF-8编码的,但我不确定。他们的文件没有说明任何事情。目前,我只是想重现我如何在QByteArray和const char*之间来回移动,因为我知道编码。我已经在您编辑后发布了答案。现在我知道你的问题不准确。你为什么需要这个转换?你需要用它做什么?我需要这个转换,因为我使用一个库libdmtx来解码数据矩阵图像。解码器返回一个
常量char*
,我试图基本上得到二进制表示来解析它。我猜返回的字符串是UTF-8编码的,但我不确定。他们的文件没有说明任何事情。目前,我只是想重现我如何在QByteArray和const char*之间来回移动,因为我知道编码。
char msg[] = { '\\', 'u', '0', '0', '0', '1', 'z', '\0' };
QString testStr = QString::fromUtf8(msg);
QByteArray testRaw = testStr.toUtf8();
qDebug() << testRaw.length() << " " << QString(testRaw);
7   "\\u0001z"
QByteArray qba;
quint8 version = 1;
qba << version;
quint8 type = 122;
qba << type;

// character '\1' is not printable, so qDebug do a developer friendly conversion 
qDebug() << qba.length() << " " << QString(qba);

// to revert conversion, you code should look like this:
QString convnerted(qba);
QByteArray reverted = convnerted.toUtf8();

Q_ASSERT(reverted == qba);