Я ищу самый простой и или элегантный способ создания QBuffer в C ++ Qt5.6 из void * data
а также long data_size
,
Я попытался привести пустоту к указателю на символ и использовать QByteArray::fromRawData()
а также используя QDataStream
заполнить 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
это устройство ввода-вывода — его нужно открыть, чтобы оно работало. Быстрый тест показывает, что он работает как положено:
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"
Поскольку вы запрашиваете элегантный способ создания QBuffer из data и data_size, я бы просто использовал это:
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
должен оставаться в силе, а также. Несоблюдение этого требования также объясняет любую неудачу.