我正在寻找在 C++ Qt5.6 中从void * data
和创建 QBuffer 的最简单和或优雅的方法long data_size
。
我尝试将 void 转换为 char 指针并使用 theQByteArray::fromRawData()
和 usingQDataStream
来填充QByteArray
. 在这两种情况下,我都没有成功。
我正在寻找在 C++ Qt5.6 中从void * data
和创建 QBuffer 的最简单和或优雅的方法long data_size
。
我尝试将 void 转换为 char 指针并使用 theQByteArray::fromRawData()
和 usingQDataStream
来填充QByteArray
. 在这两种情况下,我都没有成功。
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"
由于您要求一种从 data 和 data_size 创建 QBuffer 的优雅方法,因此我将简单地使用它:
QBuffer buffer;
buffer.setData(static_cast<const char*>(data), data_size);
注意:这会复制指向的内存data
。
我不知道你为什么不能成功,也许你忘了添加data_size
as size 参数QByteArray::fromRawData
?在这种情况下strlen(data)
,将用于计算大小。
如果你使用这样的东西:
QByteArray byteArray = QByteArray::fromRawData(static_cast<const char*>(data), data_size);
QBuffer buffer(&byteArray);
然后byteArray
必须保持有效,直到 QBuffer 被销毁。并且由于QByteArray::fromRawData(...)
不复制,指向的内存也data
必须保持有效。未能满足该要求也将解释任何失败。