从 QDataStream 读取 QDateTime 给出 null
Posted
技术标签:
【中文标题】从 QDataStream 读取 QDateTime 给出 null【英文标题】:Read QDateTime from QDataStream giving null 【发布时间】:2015-12-25 21:04:49 【问题描述】:我将以下数据区域读入 QDataStream 对象:
DE 07 05 19 0E 28 1A
这应该转换为日期/时间:25-05-2014 15:40:26
我正在尝试使用以下内容将其读入 QDateTime 变量:
QFile fileIn(iFile);
if (!fileIn.open(QIODevice::ReadOnly)) return;
QDataStream data(&fileIn);
data.setByteOrder(QDataStream::LittleEndian);
data.setVersion(QDataStream::Qt_5_0);
data.skipRawData(32);
.
.
QDateTime time;
data >> time;
qDebug () << time.date();
相反,我及时得到空/空白。 输出是:
QDate("")
【问题讨论】:
数据是如何创建的?你能举一个序列化日期然后反序列化它的最小例子吗? 我无法举例说明数据是如何序列化的,因为我正在对这些数据进行逆向工程。我将用我的更多代码修改问题。 数据是否使用 QDataStream/它的协议进行序列化?如果没有,使用 QDataStream 是没有意义的。 但是你是怎么得到DE 07 05 19 0E 28 1A
的呢?
事实上,通过QDataStream
对qint16
进行序列化“只是”将其内容写为两个字节(在给定的字节序中)。这与使用相同的任何其他东西几乎兼容。但是QDateTime
的序列化是way more complicated 并且非常特定于Qt。除非您生成具有相同语义的字节,否则您无法使用QDataStream
将它们读回(Qt 怎么会知道流中字节的含义?)。给定作者语义“正确”反序列化,然后重新组装QDateTime
。
【参考方案1】:
这里的第一件事是这些数据到底是如何序列化的。我已经看了一下,但无法解决:每个字节都不能很好地转换为日期/时间的每个部分,您尝试逆向工程的字节不是转换为十六进制的那个日期的纪元值。你不能指望QDateTime
神奇地知道你的原始数据格式。用数据格式报告,我会尽力帮助的。
【讨论】:
与其他回复一样,我似乎应该坚持我用于此类数据的方法,即分别读取 yyyy、mm、dd、hh、mi、ss。感谢您的帮助。以上是关于从 QDataStream 读取 QDateTime 给出 null的主要内容,如果未能解决你的问题,请参考以下文章
从 ipc fifo 文件描述符读取缓冲区时未初始化 QDataStream
在 C# 中使用 QDataStream 读取在 QT 中创建的二进制文件
QDataStream 读取和写入的字节数比 QFile::length() 报告的要多