如何从 QDataStream 中读取数组

Posted

技术标签:

【中文标题】如何从 QDataStream 中读取数组【英文标题】:How to read array from QDataStream 【发布时间】:2017-06-28 14:28:35 【问题描述】:

我想将存储在向量(保存结构)中的数据写入文件,并从该文件中读取数据。我尝试使用 QDataStream 并重载“>>”和“

以下是结构:

typedef struct

   char data[cNetworkMessageLengthMax + 1];   //cNetworkMessageLengthMax=19
 __attribute__((packed)) networkMessageBody_t;


typedef struct 

    baseStation_daytime_t   timestamp;
    uint32_t                blueId;
    networkMessageBody_t    message;
 __attribute__((packed)) baseStation_mailbox_t;

和运营商:

QDataStream &operator<<(QDataStream &out, const std::vector<baseStation_mailbox_t> &data)

    for(uint8_t i=0; i < data.size(); i++)
    
        out << data[i].timestamp.time.hour;
        out << data[i].timestamp.time.minute;
        out << data[i].timestamp.time.second;
        out << data[i].timestamp.time.thousandth;
        out << data[i].timestamp.date.day;
        out << data[i].timestamp.date.month;
        out << data[i].timestamp.date.year;

        out << data[i].blueId;

        out << data[i].message.data;
    
    return out;


QDataStream &operator>>(QDataStream &in, std::vector<baseStation_mailbox_t> &data)

    uint16_t tmp16;
    uint32_t tmp32;
    char tmpChar[20];

    uint8_t i = 0;
    while(in.atEnd() == false)
    
        data.emplace_back();

        in >> data[i].timestamp.time.hour;
        in >> data[i].timestamp.time.minute;
        in >> data[i].timestamp.time.second;
        in >> tmp16;
        data[i].timestamp.time.thousandth = tmp16;
        in >> data[i].timestamp.date.day;
        in >> data[i].timestamp.date.month;
        in >> tmp16;
        data[i].timestamp.date.year = tmp16;

        in >> tmp32;
        data[i].blueId = tmp32;

        in >> tmpChar;                 //HERE I get errors
        data[i].message.data = tmpChar;

        i++;
    

    return in;
    

【问题讨论】:

为什么不QString 我无法更改 networkMessageBody_t 中的 char 数组数据。除此之外,我并不反对 QString,但如果我知道在这种情况下如何使用它,我就不会在这里;) 【参考方案1】:

替换:

out &lt;&lt; data[i].message.data;out &lt;&lt; QByteArray::fromRawData(data[i].message.data,std::extent&lt;decltyple(data[i].message.data)&gt;::value); char tmpChar[20];QByteArray tmpChar; data[i].message.data = tmpChar;std::copy(tmpChar.constBegin(),tempChar.constEnd(),data[i].message.data);

【讨论】:

行得通,谢谢!但即使在查看手册页后,我也不太明白该部分是如何返回数据数组的大小的:std::extent&lt;decltyple(data[i].message.data)&gt;::value 你能详细说明extent 和值是doing 这里吗? 来自en.cppreference.com/w/cpp/types/extent: 模板 struct extent;如果 T 是数组类型,则提供等于数组第 N 维的元素数的成员常量值您可以将其替换为 20 但这样,如果您更改数据的大小,范围的大小会自动调整

以上是关于如何从 QDataStream 中读取数组的主要内容,如果未能解决你的问题,请参考以下文章

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

从 QDataStream 读取 QDateTime 给出 null

带 QDataStream 的 TGA 读取标头

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

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

qfile获取文件第一行