我试图了解QByteArray和String如何在qt中一起工作。所以,我有以下情况,我在内存中创建了一个QByteArray。
QByteArray qba;
quint8 version = 1;
qba << version;
quint8 type = 122;
qba << type;
qDebug() << qba.length() << " " << QString(qba);
debug语句打印:
2 "\u0001z"
所以,我有2个字节的数据,并提取字符串表示。
现在,我想要做的是从字符串表示开始(作为原始C ++ char数组提供给我)并创建QByteArray
表示。所以,我按如下方式创建数组:
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"
我不知道如何从这样的字符数组开始并获得字节数组表示。我不确定这是否是字符串编码问题,但无论我尝试使用哪种String方法(fromLatin1
,fromUtf16
等,我都无法重新创建此二进制表示。)
我正在使用Qt 5.9
答案 0 :(得分:0)
QString
和QByteArray
之间的转换是编码所依赖的!
您的QString(qba)
假定数据采用UTF-8编码,请参阅QString documentation。
在另一方面你有:
如此依赖,也有反之亦然的静态方法。
<小时/> 请注意qDebug() << anyString;
不会按照字面意思打印数据,而是以开发人员的形式打印,这就是为什么它被引号包围,并且不可打印的字符被转换为&#34; \ u0001&#34;
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);