Строка синтаксического анализа 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