从 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的呢? 事实上,通过QDataStreamqint16 进行序列化“只是”将其内容写为两个字节(在给定的字节序中)。这与使用相同的任何其他东西几乎兼容。但是QDateTime 的序列化是way more complicated 并且非常特定于Qt。除非您生成具有相同语义的字节,否则您无法使用QDataStream 将它们读回(Qt 怎么会知道流中字节的含义?)。给定作者语义“正确”反序列化,然后重新组装QDateTime 【参考方案1】:

这里的第一件事是这些数据到底是如何序列化的。我已经看了一下,但无法解决:每个字节都不能很好地转换为日期/时间的每个部分,您尝试逆向工程的字节不是转换为十六进制的那个日期的纪元值。你不能指望QDateTime 神奇地知道你的原始数据格式。用数据格式报告,我会尽力帮助的。

【讨论】:

与其他回复一样,我似乎应该坚持我用于此类数据的方法,即分别读取 yyyy、mm、dd、hh、mi、ss。感谢您的帮助。

以上是关于从 QDataStream 读取 QDateTime 给出 null的主要内容,如果未能解决你的问题,请参考以下文章

从 ipc fifo 文件描述符读取缓冲区时未初始化 QDataStream

带 QDataStream 的 TGA 读取标头

在 C# 中使用 QDataStream 读取在 QT 中创建的二进制文件

QDataStream 读取和写入的字节数比 QFile::length() 报告的要多

QDataStream readQString() 如何读取 utf8 字符串

向/从文件写入/读取位域结构