【问题标题】:How to convert QVector<double> to QBytearray如何将 QVector<double> 转换为 QBytearray
【发布时间】:2015-01-06 15:15:58
【问题描述】:

我想将QVector&lt;double&gt; 转换为QBytearray,但我不知道该怎么做。 我试过了,但程序崩溃了:

QVector<double> vec;
QByteArray arr = QByteArray::fromRawData(reinterpret_cast<const char*>(vec),vec.size());
for(int i = 0; i< vec.size(); i++)
    arr.append(reinterpret_cast<const char*>(vec.data(&numberOfData),sizeof(double));

谁能告诉我如何正确操作?

【问题讨论】:

  • 您首先必须指定您希望QByteArray 包含的内容。只是来自向量的原始二进制数据?
  • @Angew 你是什么意思?接下来我将使用Qbytearray来显示图片。
  • QVector&lt;double&gt; 是一个浮点数数组。 QByteArray 是一个字节数组。您需要指定“转换”的含义。存储浮点数的二进制数据(例如memcpy 会这样做)?还是别的什么?
  • 如果你甚至不使用循环变量来访问向量中的元素,循环就没有任何意义......

标签: c++ qt qbytearray


【解决方案1】:

您可以使用QVector::constData 获取指向向量中包含的(常量)原始数据的指针。但是,您还需要将大小乘以单个条目的大小,即sizeof(double)。之后你不需要像在你的代码中那样循环。

QByteArray data = QByteArray::fromRawData(
        reinterpret_cast<const char*>(vec.constData()),
        sizeof(double) * vec.size()
    );

您还可以使用QDataStream 进行转换,从而生成更简洁的代码,同时还可以处理潜在的byte ordering issues

QByteArray data;
QDataStream stream(&data, QIODevice::WriteOnly);
for (auto x : vec)
    stream << x;

【讨论】:

    【解决方案2】:

    您必须通过本机数组,因此您的 QByteArray 将接收一系列连续字节。

    double *bytes = new double[vec.size()];
    for (int i = 0; i < vec.size(); ++i) {
       bytes[i] = vec[i];
    }
    QByteArray array = QByteArray::fromRawData(reinterpret_cast<void*>(bytes));
    delete []bytes;
    

    免责声明:未经测试的代码。

    --- 更新---

    正如 leemes 正确指出的那样,您不需要分配和复制字节数组,QVector 已经为原始数据提供了两个访问函数。所以你可以简单地使用 data() 和 constData()。 请看他的回复。

    【讨论】:

    • 如果vec.data() 已经为您提供了指向该向量的指针,为什么还要将向量复制到原始数组?
    • 对。我忘记了 data() 和 constData(),我几乎从不使用它。
    【解决方案3】:

    今天这种转换更加简单:

    QVector<double> vec;
    // populate vector
    QByteArray data;
    QDataStream stream(&data, QIODevice::WriteOnly);
    stream << vec;
    

    【讨论】:

    • 我有几年没有使用 Qt,所以不知道,但一个简单的测试应该会给你答案。
    • 有人刚刚对一个简化的语法答案投了反对票,但没有提供任何反对的动机。听起来这是报复性的投票或拖钓,因此在 SO 上没有地位。这种资源正日益成为污水池。
    【解决方案4】:

    我也对此有些恼火。基于此处的其他答案,我想出了这个:

    template<typename data_type>
    QByteArray toByteArray(data_type data) {
        QByteArray bytes;
        QDataStream stream(&bytes, QIODevice::WriteOnly);
        stream << data;
        return bytes;
    }
    

    这应该让您编写以下代码:

    QVector<double> vec{1, 2, 3, 4};
    auto bytes = toByteArray(vec);
    

    并且也适用于支持流式传输到 QDataStream 的其他类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-30
      • 2014-04-24
      • 2014-12-10
      • 2015-02-05
      • 2017-08-31
      • 2010-11-09
      • 2014-05-05
      • 2014-12-23
      相关资源
      最近更新 更多