我有一个二进制数据流,其中包含应该被解释为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
而不依赖于字符串的大小(因为服务器没有该信息)但是在字符串终结符{ {1}}。如何实现这一目标?
由于此解码将在不同的机器上完成,因此如何在客户端上生成原始数据以避免有关endianess的问题?
答案 0 :(得分: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