首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从二进制数据流解析未定义大小的Qt字符串

从二进制数据流解析未定义大小的Qt字符串
EN

Stack Overflow用户
提问于 2013-11-06 14:06:49
回答 1查看 1.3K关注 0票数 0

我有一个二进制数据流,其中包含应该被解释为Qstring的数据。从第三个字节开始。下面是(在客户机上)生成包的方式。

代码语言:javascript
复制
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 of value "filename.txt" )中获得一个值"filename.txt",而是依赖字符串终止符00。如何才能做到这一点?

由于此解码将在另一台机器上进行,如何在客户端上生成原始数据以避免出现endianess问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-06 14:57:05

您应该将QByteArray封装在一个QDataStream中,这样就可以显式地指定endianess,并使用流运算符。

代码语言:javascript
复制
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

然后你可以从另一个方向读到:

代码语言:javascript
复制
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数组:

代码语言:javascript
复制
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上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19814193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档