0

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

我尝试将 void 转换为 char 指针并使用 theQByteArray::fromRawData()和 usingQDataStream来填充QByteArray. 在这两种情况下,我都没有成功。

4

2 回答 2

4

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"
于 2016-03-29T12:53:54.360 回答
1

由于您要求一种从 data 和 data_size 创建 QBuffer 的优雅方法,因此我将简单地使用它:

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

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


我不知道你为什么不能成功,也许你忘了添加data_sizeas size 参数QByteArray::fromRawData?在这种情况下strlen(data),将用于计算大小。

如果你使用这样的东西:

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

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

于 2016-03-29T13:19:27.180 回答