Строка синтаксического анализа Qt неопределенного размера из потока двоичных данных

У меня есть поток двоичных данных, который содержит данные, которые должны быть интерпретированы как Qstring. Начиная с третьего байта. Вот как пакет генерируется (на клиенте).

QByteArray package;
package.append( QByteArray::fromHex("0002") );  // First two bytes
package.append( "filename.txt" );               // String of undefined size
package.append( QByteArray::fromHex("00"));     // End of string

Декодирование выполняется на другом компьютере (сервере). Я хотел бы получить Qstring стоимости "filename.txt" от QByteArray package не полагаясь на размер строки (поскольку сервер не имеет этой информации), но на терминатор строки 00, Как этого достичь?

Поскольку это декодирование будет выполняться на другом компьютере, как должны генерироваться необработанные данные на клиенте, чтобы избежать проблем с порядком байтов?

1 ответ

Решение

Вы должны обернуть QByteArray в QDataStream так что вы можете явно указать порядок байтов и использовать операторы потока

QByteArray package;
QDataStream stream(package, QIODevice::WriteOnly);
stream.setByteOrder( QDataStream::BigEndian);
stream << static_cast<quint16>(0x0002);  // First two bytes
stream << "filename.txt";               // String of undefined size
// no need to write terminating 0 because data stream will prepend length

тогда вы можете прочитать в другом направлении:

QByteArray package;
QDataStream stream(package, QIODevice::WriteOnly);
stream.setByteOrder( QDataStream::BigEndian);
quint16 id;
stream >> id;  // First two bytes
char* filename;
stream >> filename; // String of undefined size
QString file = QString.fromLatin1(filename);
delete[] filename; //cleanup

или вы можете сначала передать QString в поток, и вам не нужно иметь дело с массивом char:

QByteArray package;
QDataStream stream(package, QIODevice::WriteOnly);
stream.setByteOrder( QDataStream::BigEndian);
stream << static_cast<quint16>(0x0002);  // First two bytes
stream << QStringLiteral("filename.txt"); // String of undefined size

обратите внимание, что это будет писать в UTF16, что означает, что Unicode включен

формат сериализации задокументирован по адресу http://qt-project.org/doc/qt-5.0/qtcore/datastreamformat.html

Другие вопросы по тегам