【问题标题】:QBuffer from void pointer and memory size来自 void 指针和内存大小的 QBuffer
【发布时间】:2016-07-17 00:06:36
【问题描述】:

我正在寻找从void * datalong data_size 在 C++ Qt5.6 中创建 QBuffer 的最简单或优雅的方法。

我尝试将 void 转换为 char 指针并使用 QByteArray::fromRawData() 以及使用 QDataStream 填充 QByteArray。在这两种情况下我都没有成功。

【问题讨论】:

  • “我没有成功”是什么意思?你有没有收到错误或什么?
  • 我正在使用 QBuffer 播放音频,到目前为止,在每种情况下我都只会听到噪音或静音。当转换为 char 指针时,我在进程的某个地方遇到了缓冲区不足。
  • 你知道吗,QByteArray::fromRawData 没有将缓冲区复制到 QByteArray 吗?使用此方法 QByteArray 使用您的指针。
  • @gro - 这个问题是关于来自 void * 的 QBuffer。如果您有不同的问题,请直接发布。

标签: c++ qt void-pointers qbytearray qbuffer


【解决方案1】:

QByteArray::QByteArray(const char *data, int size) 将复制数据。

QByteArray::fromRawData(const char *data, int size) 将使用已经存在的数据。

根据您的实施,不复制数据最终可能会出现问题。

你有了字节数组中的数据后,有几种方法可以走,你可以直接构造一个缓冲区:

QBuffer(QByteArray *byteArray, QObject *parent = Q_NULLPTR)

或者更有可能,因为您正在播放音频,您可能希望重用相同的缓冲区并使用以下方法之一来重新填充它:

setBuffer(QByteArray *byteArray)
setData(const QByteArray &data)

最后,还有void QBuffer::setData(const char *data, int size),您甚至根本不需要字节数组步骤。

最后,请记住QBuffer 是一个 IO 设备 - 需要打开它才能工作。快速测试表明它按预期工作:

char data[] = {1, 2, 3};
void * vdata = data;
QBuffer buffer;
buffer.setData((char *)vdata, sizeof(data));
buffer.open(QIODevice::ReadOnly);
qDebug() << buffer.readAll(); // outputs "\x01\x02\x03"

【讨论】:

    【解决方案2】:

    由于您要求一种从数据和 data_size 创建 QBuffer 的优雅方式,我会简单地使用这个:

    QBuffer buffer;
    buffer.setData(static_cast<const char*>(data), data_size);
    

    注意:这复制data指向的内存。


    我不知道您为什么无法成功,也许您忘记添加data_size 作为QByteArray::fromRawData 的大小参数?在这种情况下,strlen(data) 将用于计算大小。

    如果你正在使用这样的东西:

    QByteArray byteArray = QByteArray::fromRawData(static_cast<const char*>(data), data_size);
    QBuffer buffer(&byteArray);
    

    那么byteArray 必须保持有效,直到 QBuffer 被销毁。由于QByteArray::fromRawData(...) 不复制,data 指向的内存也必须保持有效。未能满足该要求也可以解释任何失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      相关资源
      最近更新 更多