问题标签 [qdatastream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 从 QTcpSocket 读取(许多)值(快速)
我正在使用一个测量设备,它使用高达 70 kHz 的 tcp 套接字发送(二进制)浮点值。
我的目标是尽可能快地读取这些值并将它们用于我程序的其他部分。
到目前为止,我可以使用 QTcpSocket 和 QDataStream 按值提取值:
首先,我创建套接字并将流连接到它
然后我从套接字读取并将流数据写入我的浮点值
当我测量 while(true) 循环的迭代频率时,我能够达到大约 30 kHz。每次读取多个值我可以达到 70 Khz。(不考虑其他可能会减慢我速度的计算)
我的问题是:
- 如果我一次读取多个值,如何从 QDataStream 中提取这些值?我需要一个 6 字节的间距,其中只有 4 个字节包含该值。
答:在我的情况下,有 2 个字节(垃圾)后跟已知数量的值,例如浮点数为 4 个字节,另一个浮点数为 4 个字节,uint16 为 2 个字节。
- 扩展 1:我可以将我的设备配置为发送需要写入不同变量的不同类型(int、float)的不同值。
答:一样。
- 有没有更有效的方法从 QTcpSocket 读取许多值?
回答:在评论中回答。
更新(回答一些问题):
- 以字节为单位的最大速率:70 kHz x 6 字节(对于一个值)= 420 kB/s(似乎没有那么多:))
更新 2
- 新问题:当我开始交易(使用
stream.startTransaction
)时,我想知道二进制代码中该流中的内容。 - 我不明白如何
QDataStream::startTransaction
工作。将读取多少字节?我不使用提取的数据会发生什么>>
?
我尝试了以下方法:
一次又一次地这样做,我有时会得到 status = -1(读得太多),有时不会。如何获得流的“大小”?
qt - 使用 QDataStream 使用枚举(反)序列化 QSet
我使用 Qt 4.8.7。我有enum Color {red, green, blue}
和QSet<Color>
。我应该如何(反)序列化QSet<Color>
使用QDataStream
?自定义类型反序列化失败。除了反序列化之外,我还应该手动创建序列化(循环 QSet 元素)吗?我的意思是QSet的内部序列化实现理论上可以由Qt开发者改变,所以我必须自己写两个循环进行序列化/反序列化。
c++ - 使用 QDataStream 对原始数据进行反序列化
我有来自 tcp 套接字的数据作为原始数据(我有指定的格式),然后基于该数据创建一个对象。格式是这样的:24 字节的标头[数据大小和一些其他信息],然后是标头中指定的数据量。
我想把它当作一个对象来读(对象有一个内部数据缓冲区,其中数据是动态大小的)。是否有可能以某种方式覆盖 QDataStream 或以其他方式优雅地包装它?我想利用事务方法来读取整个数据包,如果它们是分段的(半个标题,或者只是不是全部数据),则不负责组装它们。
所以基本上我想做这样的事情:
c++ - 抽象类的 QDataStream 运算符 << 重载
我想将抽象类的<<运算符重载为虚拟运算符,我知道如何为简单类重载运算符,下面的代码是一个示例。
但是现在假设我们有如下的 AbstractBaseClass、ChildClass
现在我想为应该实现它的 AbstractBaseClass 重载 << 运算符。
这是我的尝试
编译器抱怨:虚拟外部类声明,你知道吗?
qt - 子类化 QIODevice:QUdpSocket 的包装器
我正在尝试在QUdpSocket上实现我自己的包装器,因为它使用起来不舒服。我可以使用它,但无论如何我需要实现一些中间缓冲区来访问QDataStream操作。另外的:
我继承QIODevice,
标题(有点简化):
.cpp 文件:
来自QIODevice::readData()上的 Qt 文档
..当重新实现这个函数时,这个函数在返回之前读取所有需要的数据是很重要的。为了使 QDataStream 能够对类进行操作,这是必需的。QDataStream 假定所有请求的信息都已读取,因此如果出现问题不会重试读取...:
问题是在第一次读取后我有空缓冲区,因此我的bytesAvailable()方法返回 0:
因此,在使用该类时,我无法找出可用的字节数,例如:
如何QUdpSocket
正确编写自己的包装器?
使用中间缓冲区的想法很有效,直到我决定将逻辑移动到单独的QIODevice
派生类。
c++ - QDataStream 不增加 QByteArray 的位置
当我重复将原始网络字节写入 QDataStream 对象时,QDataStream 永远不会增加底层 QByteArray 的写入位置。
这是代码:
为什么会这样?
该代码在 Linux Mint 18 64Bit 上运行良好。但它不适用于 Windows 10 64Bit。
我将 Qt Creator 4.3.1 与 Qt 5.9.1 一起使用。
c++ - 为什么我需要 reinterpret_cast 从 `long &` 到 `int &` 两者都是 32 位(Windows LLP64)?
我正在跨平台环境中使用 Qt。我们遇到了以下问题:在 Windows 上,int
和long int
都是 32 位整数;在 64 位 MacOS 和 Linux 上,int
是 32 位和long int
64 位(参见https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models)。
因此,跨平台库倾向于提供自己的固定位类型定义。在 Windows 上,Qt 定义quint32
为 aunsigned int
并且不使用unsigned long
整数。Uint32
然而,另一个库将其定义为unsigned long
. 因此,两者实际上都是 32 位无符号整数,但具有不同的原始数据类型。
现在,碰巧的是,我们尝试使用为数据QDataStream
定义的序列化,令我们惊讶的是(或没有),Visual C++ 抱怨没有为它定义的操作符是真的,因为 Qt 使用了几乎等价的代替。quint32
Uint32
QDataStream
unsigned long
unsigned int
好的,解决方法是提供
我的问题是:为什么我需要reinterpret_cast
?我会觉得更舒服的static_cast
是,据我所知,数据类型实际上是相同的。这里有龙?
qt - QDataStream 未按预期工作
我在 QDataStream 中存储了一些数据并立即获取数据,但是在检索时计数显示为零。代码看起来不错,但行为出乎意料
c++ - qt c++ 使用 tcp 协议发送 6 个字节
大家好,首先我是网络编程的新手,所以也许这是一个简单的问题,但我不明白。我尝试使用 tcp 套接字向微控制器发送 6 个字节。为了序列化我的数据,我使用了 qdatastream 和 qbytearray。这就是我尝试这样做的方式:
例如,我的 struct dataMessage 看起来像这样: dataMessage={15,1,9400000} 在我的缓冲区中,我希望这个字节序列 "\x06\xF0\x01\x00\x8F\6E\xC0" 但我总是得到以下信息输出“\x06\xF0\x01\x00\x8Fn\xC0”。
我究竟做错了什么?
qt - QDataStream 和 QTcpSocket 上的发送和接收结构
我对如何通过 QTcp 套接字接收和发送结构感到困惑。
所以说我的数据包看起来像这样(01 00 00 68 65 6c 6c 6f)
构建我的结构,然后使用 qdatastream 运算符反序列化或序列化数据包数据....
我该怎么做填充...
一些例子会有所帮助