qt - 为什么 QDatastream 没有给出正确的输出
问题描述
在给定的代码中,我首先在流中插入 1 个数字,然后将该值放入名为 Variable 的测试中。
当我打印变量时,我得到的输出是 0 而不是 1。
这是代码。
QByteArray data;
QDataStream stream(&data, QIODevice::ReadWrite);
stream << 1;
int test;
stream >> test;
qDebug() << test;
解决方案
当您QDataStream
像您一样创建时,QBuffer
将用作内部QIODevice
(请参阅https://doc.qt.io/qt-5/qdatastream.html#QDataStream-2)。
QBuffer
不会像 FIFO 队列那样工作,它只会记住它完成最后一次操作的时间,并从该点开始另一个操作。
当您向流中写入内容时,“位置”将在新数据之后移动。由于缓冲区一开始是空的,光标将指向数据的末尾,任何读取尝试都会失败。如果您想阅读您所写的内容,则必须将光标移回。
也许下面的例子会让这个想法更清楚:
QByteArray data;
QDataStream stream(&data, QIODevice::ReadWrite);
stream.setByteOrder(QDataStream::LittleEndian);
const std::uint32_t input = 0x01020304; // 0x01020304 = 16909060
qDebug() << "Device pos before write: " << stream.device()->pos();
stream << input;
qDebug() << "Device pos after write: " << stream.device()->pos();
qDebug() << "data content after write: " << data;
stream.device()->seek(0);
qDebug() << "Device pos after seek: " << stream.device()->pos();
std::uint32_t test;
stream >> test;
qDebug() << "Read: " << test;
qDebug() << "Device pos after read: " << stream.device()->pos();
输出:
Device pos before write: 0
Device pos after write: 4
data content after write: "\x04\x03\x02\x01"
Device pos after seek: 0
Read: 16909060
Device pos after read: 4
推荐阅读
- php - Nginx 下载 phpMyAdmin index.php 而不是执行它
- spring - Spring Boot:每次向客户端发出删除请求时,如何将实体 ID 重置回 0
- c - 错误:没有前面的“if”的“else”,但我认为我使用了正确的语法
- python - 输出中包含用户值的 Collatz 序列
- java - .dismiss 后 Android 对话框未关闭
- javascript - Testcafe:即使通过了正确的选择器,也无法选择元素。任何帮助将不胜感激?
- gdal - gdal_calc 在尝试重新分类时产生错误的结果
- delphi - WM_NCHITTEST 是否应该由 Win10 以每秒 100 次的频率永久生成,即使鼠标处于空闲状态?
- python - 解压base64decode解码字符串时出错
- excel - 此例程在保护模式下不起作用