来自void指针和内存大小的QBuffer

时间:2016-03-29 12:25:15

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

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

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

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

由于您要求使用data和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指向的内存也必须保持有效。不符合要求也可以解释任何失败。