QDataStream 和 QDataStream 的问题QDataStream::运算符>> ( 字符 *& s )
QFile msnLogFile(item->data(Qt::UserRole).toString());
QDataStream logDataStream;
if(msnLogFile.exists()){
msnLogFile.open(QIODevice::ReadOnly);
logDataStream.setDevice(&msnLogFile);
QByteArray logBlock;
logDataStream >> logBlock;
}
这段代码不起作用。结果的 QByte 是空的。如果我使用 char* 也是一样。奇怪的是,相同的代码可以在另一个程序中运行。我想找出两者之间的区别。如果我使用 int、uint、quint8 等,这将有效
QFile msnLogFile(item->data(Qt::UserRole).toString());
QDataStream logDataStream;
if(msnLogFile.exists()){
msnLogFile.open(QIODevice::ReadOnly);
logDataStream.setDevice(&msnLogFile);
QByteArray logBlock;
logDataStream >> logBlock;
}
This code doesnt work. The QByte that results is empty. Same thing if I use a char* . Oddely enough the same code works in another program. Im tying to find the difference between both. This works if i use int,uint, quint8, etc
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
假设 msnLogFile 以前不是使用 QDataStream 创建的(如果是,则完全忽略此答案),您不想使用 >>操作员。
原因是当 QDataStream 写入字符串时,它将字符串的长度添加到输出字节中。这允许另一个 QDataStream 以正确的长度读回它并获得相同的结果。因此,为什么 int、qint8 等可以正常工作?没有预先设定的大小,只是原始数据。
如果 msnLogFile 的内容是严格的文本,则需要传递 QIODevice::Text 标志打开并使用 QIODevice::readLine() 或 QIODevice::readAll(),但是如果它是二进制数据,您' d 必须使用 QDataStream::readRawData() 并读回数据以正确的顺序和正确的尺寸。
Assuming msnLogFile was not previously created using a QDataStream (if it was, then ignore this answer completely), you don't want to use the >> operator.
The reason is that when QDataStream is writing strings, it prepends the length of the string to the output bytes. This allows another QDataStream to read it back in with the correct length and get the same result. Hence, why int, qint8, etc work correctly; there's no prepended size, it's just the raw data.
If the contents of msnLogFile are strictly text, you need to pass the QIODevice::Text flag to open and use QIODevice::readLine() or QIODevice::readAll(), however if it's binary data you'd have to use QDataStream::readRawData() and read the data back out in the correct order with correct sizes.
我斗胆猜测这是因为您没有指定协议版本。您应该调用
setVersion()
以确保多台机器,可能使用不同版本的 Qt,都使用相同的协议版本。I'd venture to guess it's because you're not specifying the protocol version. You should call
setVersion()
to ensure that multiple machines, which may be using different versions of Qt, all use the same protocol version.