zoukankan      html  css  js  c++  java
  • 【转】从QDataStream向QByteArray中写入数据时的注意点(QT)

     

    最近发现从QDataStream向QByteArray中写入数据常常是写不进去的,通过查看QT的源码:

    复制代码
    QDataStream &operator>>(QDataStream &in, QByteArray &ba)
    {
    ba.clear();
    quint32 len;
    in >> len;
    if (len == 0xffffffff)
    return in;

    const quint32 Step = 1024 * 1024;
    quint32 allocated = 0;

    do {
    int blockSize = qMin(Step, len - allocated);
    ba.resize(allocated + blockSize);
    if (in.readRawData(ba.data() + allocated, blockSize) != blockSize) {
    ba.clear();
    in.setStatus(QDataStream::ReadPastEnd);
    return in;
    }
    allocated += blockSize;
    } while (allocated < len);

    return in;
    }
    复制代码

    发现原来其中有一句:

    1
    if (in.readRawData(ba.data() + allocated, blockSize) != blockSize) {

    它检查读入的数据是不是整数个blockSize,如果不是,那么下面它会将QByteArray清空:

    1
    ba.clear();
     

    所以如果想从QDataStream读入数据岛QByteArray中,可以采用下面的方法:

    复制代码
    QDataStream &operator>>(QDataStream &in, QByteArray &ba)
    {
    ba.clear();
    quint32 len;
    in >> len;
    if (len == 0xffffffff)
    return in;

    const quint32 Step = 1024 * 1024;
    quint32 allocated = 0;

    do {
    int blockSize = qMin(Step, len - allocated);
    ba.resize(allocated + blockSize);
    if (in.readRawData(ba.data() + allocated, blockSize) < blockSize) {
    return in;
    }
    allocated += blockSize;
    } while (allocated < len);

    return in;
    }
    复制代码
     

    最后回过头来看一下将QByteArray写入QDataStream的方法

    复制代码
    QDataStream &operator<<(QDataStream &out, const QByteArray &ba)
    {
    if (ba.isNull() && out.version() >= 6) {
    out << (quint32)0xffffffff;
    return out;
    }
    return out.writeBytes(ba, ba.size());
    }
    复制代码

    其实是将QByteArray中所有的数据都写入QDatStream中,并没有扩展QByteArray的大小到blockSize,

    所以针对这种情况,我们在使用QDataStream向QByteArray中读写数据的时候,需要手动将QByteArray

    扩展到blockSize(1024*1024)大小。

  • 相关阅读:
    为MYSQL加注释--mysql注释符
    基于SSM3框架FreeMarker自定义指令(标签)实现
    SpringMVC工作原理
    Web系统从Oracle迁移至MySQL
    Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解
    深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
    MySQL存储引擎
    mysql常用函数
    转:FIFO的定义与作用
    转:memset用法详解
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/10207409.html
Copyright © 2011-2022 走看看