- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要处理由另一个非 Qt 程序创建的已定义结构的流式二进制数据 (QDataStream)。我想知道解释该数据的最佳做法是什么。假设数据在电报中结构化(提供结构定义)如下,我不能更改:
4字节头| 2字节序号 | 1 字节校验和 | 10字节数据
我看到在“电报”类中处理数据的以下可能性:
return (array.at(4)<<8) + array.at(5)
等公共(public)方法访问和解释变量对于序号,with不是很优雅。telegramstruct.squenceNumber
我发现这种方法存在潜在问题,例如字节顺序和填充。QString strHeader
.从流中读取电报时,数据直接存储在这些变量中。读取是通过 readRawData 完成的,或者对于基本类型是通过 operator>> 完成的。 代码应该尽可能快,因为有很多数据要处理。我在带有 MinGW 的 Windows 上使用 Qt 5.0.1。
我的问题:
非常感谢您的意见和提示。
克里斯
最佳答案
抱歉,没有那么多时间来编写代码示例,但会尝试给出简短的提示。1)性能问题。一旦您遇到性能限制,首先要优化的是从数据来源流中实际读取的数量。无论它是文件/套接字/等等,它都是 QIODevice。因此,首先要做的是维护某种类型的 QByteArray,在其中添加 QIODevice 上的所有可用数据,以便在每次准备好尝试/处理数据时收到通知。所以在下面我假设有某些 QByteArray m_rawData 保存当前未处理的字节,它可以是一定数量的电报 + 可以部分接收的最后一个电报。
2) 我会创建一个像 Telegram 这样的类来保存电报数据,大致说
class Telegram {
QString header;
int sequenceNumber;
unsigned char checkSum;
QByteArray data;
...
bool checkSumOK(); // check is checksum is OK for provided data
}
根据您的喜好使用构造函数和运算符(您可以实现复制构造函数等)..然后,我将使用 ( <<, >>) 运算符扩展此类,以支持在第 1 部分中提到的临时缓冲区上运行的 QDataStream。
一般概念是您尽快从流中读取数据到临时缓冲区,读取完成后,您从结果缓冲区中获取尽可能多的 Telegram 实例。然后,您使用应用于 QByteArray 的 QDataSteam,您可以安全地使用读取 4 个字节、读取 1 个字节等调用,而不会对性能产生太大影响,因为通常它主要是关于移动指针。
3) 当然,如果你谈论极端条件.. 你可以考虑 union (如前一个答案中提到的)在对齐结构的顶部直接复制原始数据,但这种方式需要更仔细的编程(特别是考虑到 x32/x64 archs 以及 big/little endians 平台)
关于c++ - 最佳实践 : how to interpret/process QDataStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16014230/
我有一个相当奇怪的问题,使用 QDataStream,或者至少对我来说很奇怪,因为我根本不理解这种行为。 当然,我的问题来自一个大项目,但我设法用一个最小的例子重现了这种奇怪的行为,我现在将对此进行描
QFile msnLogFile(item->data(Qt::UserRole).toString()); QDataStream logDataStream; if(msnLogFile
我有一个包含两个主要模块的应用程序。一个是用 C 编写的,使用标准 C 运行时库,另一个是用 Qt C++ 编写的。它们通过 IPC 相互通信。 C 模块创建一个 char 数组,用数据填充它并发送到
我正在努力学习教程 here并序列化 Qt 对象。这是我的代码: QFile file("/Users/kaustav/Desktop/boo.dat"); if (!file.open(QIODev
我想将 QVector 序列化为 char* 数组。我通过以下代码执行此操作: QVector in; ... QByteArray bytes; QDataStream stream(&bytes,
我正在尝试保存 3 QVector和一个带有 QDataStream 的整数. 我重载了 operator #include #include class CloudData { public:
我正在尝试将特征向量序列化为 QDataStream: #include "utils.h" #include "Eigen/Eigen" int main(int argc, char *argv[
我正在用 Qt 实现一个小接口(interface)。在我目前正在处理的步骤中,我有 Scores(自定义类)我可以在只能容纳一个 Score 的 Docks(同样是自定义类)上移动。 我用这个例子启
假设我有一个创建 QIODevice(例如 QFile)的函数,然后返回一个指向从 QIODevice 构造的 QDataStream 的指针。在这里处理内存分配的最佳方法是什么?显然,QIODevi
我需要通过 QTcpSocket 接收二进制数据(读取浮点数)并使用 QDatastream 将它们写入 Qfile。但是我在使用 QDataStream 时遇到了一些问题。如下,我只能用这种方式来实
请考虑以下来自 QDataStream 的代码片段文档: QFile file("file.dat"); file.open(QIODevice::ReadOnly); QDataStream in(
我目前正在尝试在我的代码中实现一个序列化系统,该系统将一个类型的多个对象存储在一个文件中。这非常有效,我通常只是使用 OpenMode QIODevice::Append 将它们一一附加。这里没有问题
我想将存储在 vector (保存结构)中的数据写入文件,并从该文件读取数据。我尝试使用 QDataStream 并重载“>>”和“ &data) { for(uint8_t i=0; i >
我想为抽象类重载 class AbstractBaseClass { public: AbstractBaseClass(); int BaseFirstField() const;
我正在尝试在 QTcpSocket 上发送一个 QByteArray 。我面临的问题是,虽然我发送了一个长度为 25 的数组,但在服务器上它收到了 59 个字节。这是我的示例代码: //client
这是一个关于在 C++ 和 Linux 中使用 QDataStream 和 QTemporaryFile 的 QT 问题。 我在刷新 QDataStream 时遇到了一些问题。 QTextStream
我正在 Qt 中编写一个简单的基于 TCP 的网络应用程序并想使用 QDataStream和 QByteArray通过网络发送数据。问题是当我将数据放入 QByteArray 时他们被“归零”了。例如
我有来自 tcp 套接字的数据作为原始数据(我有指定的格式),然后基于该数据创建一个对象。格式是这样的:24 字节的 header [数据大小和一些其他信息],然后是 header 中指定的数据量。
我有一个文件,假设长度为 8 个字节。例如它看起来像这样: 22222222 现在,我先读取 5 个字节并更改它们。对于前。到 11111 最后,我想将它们写入 ONTO EXCISTING DATA
根据本网站上的各种答案,我尝试定义自己的模板函数以将任何枚举值写入 QDataStream。 template ::value>> QDataStream &operator>(enumValue);
我是一名优秀的程序员,十分优秀!