Проблема здесь заключается в записи QString
непосредственно в поток, который ожидает QByteArray
, рассмотрим следующее
QByteArray block;
QDataStream s(&block, QIODevice::OpenModeFlag::ReadWrite);
QString h = "hello";
s << h;
qDebug() << block;
, которое выводит
"\x00\x00\x00\n\x00h\x00""e\x00l\x00l\x00o"
Итак, данныетам, это просто не там, как можно было бы ожидать.Самый простой способ решить эту проблему - создать QByteArray
из строки, кодированной с помощью UTF8 (или другой кодировки по вашему выбору).Это может быть легко сделано на лету,
QByteArray block;
QDataStream s(&block, QIODevice::OpenModeFlag::ReadWrite);
QString h = "hello";
QByteArray data(h.toUtf8(), 5);
s << data;
qDebug() << block;
, который выводит
"\x00\x00\x00\x05hello"
Потому что, когда этот QByteArray
отправляется через QDataStream
длину массива и 3 NULL
символов предваряются - NULL
символы присутствуют в случае, если буфер больше сравнительно небольшого 5
(вы можете проверить это сами, передав большее значение - малый коэффициент 256 наиболее показателен), так каквторой параметр в конструкторе QByteArray
, так как это длина буфера).Но если вы попытаетесь явно создать QString
(как это делает s >> h
) из NULL
-comced QByteArray
, это создаст пустую строку.Чтобы исправить это, вы можете использовать QByteArray::remove()
для удаления первых 4
байтов, подобных этому
QByteArray block;
QDataStream s(&block, QIODevice::OpenModeFlag::ReadWrite);
QString h = "hello";
QByteArray data(h.toUtf8());
s << data;
qDebug() << QString::fromUtf8(block.remove(0, 4));
Какие выходные данные
"hello"
Полный пример
#include <qbytearray.h>
#include <qdatastream.h>
#include <qdebug.h>
int main() {
QByteArray block;
QDataStream s(&block, QIODevice::OpenModeFlag::ReadWrite);
QString h = "hello";
QByteArray data(h.toUtf8());
s << data;
qDebug() << QString::fromUtf8(block.remove(0, 4));
}