【问题标题】:QDataStream on QByteArray: Is it safe to read from the array ('[ ]') between writes on the DataStream ('<<')?QByteArray 上的 QDataStream:在 DataStream ('<<') 上的写入之间从数组 ('[ ]') 读取是否安全?
【发布时间】:2019-05-16 10:05:17
【问题描述】:

我正在使用QDataStream 将数据(使用流的&lt;&lt; 运算符)序列化为QByteArray。但我一直在想:在&lt;&lt; 操作之间从底层QByteArray 读取是否安全(或者我可能会遇到例如缓冲问题)?

quint8 sumBytes(const QByteArray& byteArray)
{
    //This will overflow quickly...
    quint8 result = 0;
    for (int i = 0; i < byteArray.size(); i++)
        result += static_cast<quint8>(byteArray[i]);
    return result;
}

QByteArrary createByteArray(qint32 foo, qint32 bar)
{
    QByteArray array;
    QDataStream stream(&array, QIODevice::ReadWrite);
    stream<< foo;
    stream<< bar;
    // Safe to access array below?
    const quint8 byteSum = sumBytes(array);
    stream<< byteSum;
    return array;
}

我检查了 QDataStreamQByteArray 的文档,但没有看到任何相关内容,除了提到 QDataStream 使用 QBuffer 因为 QByteArray 不是 QIoDevice (这让我问这个问题)。再一次,QDataStream 没有提供flush()(或类似方法),所以它可能是安全的......?

【问题讨论】:

    标签: c++ qt serialization


    【解决方案1】:

    当然。请记住,您已将QByteArrayconst 版本传递给sumBytes,这保证了对象的内部状态不会改变。

    你也可以考虑使用.at():

    at() 可以比operator[]() 更快,因为它永远不会导致发生深拷贝。

    (source)

    【讨论】:

    • 感谢有关 at() 运算符的提示(尽管我假设数组是 const &amp; 将阻止调用非 const 版本的 [ ] 并因此阻止深层复制) .我担心的是QDataStream 可能已经缓冲(即尚未提交)更改/写入QByteArray 导致我读取过时的数据。
    • 啊,我可能误读了这个问题。有趣的是,QDataStream provides read transactions;虽然不太确定写交易,但我猜这就是你所追求的。 ?
    猜你喜欢
    • 2019-05-26
    • 2017-04-21
    • 2016-11-04
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多