0

我有一个二进制数据流,其中包含应解释为 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

解码在不同的机器(服务器)上完成。我想从不依赖字符串的大小(因为服务器没有该信息)但在字符串 terminator 上获得一个Qstring值。如何做到这一点?"filename.txt"QByteArray package00

由于此解码将在不同的机器上完成,应如何在客户端生成原始数据以避免字节序问题?

4

1 回答 1

1

您应该将QByteArraya包装起来,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

于 2013-11-06T14:57:05.170 回答