QBuffer от пустого указателя и объема памяти

Я ищу самый простой и или элегантный способ создания QBuffer в C ++ Qt5.6 из void * data а также long data_size,

Я попытался привести пустоту к указателю на символ и использовать QByteArray::fromRawData() а также используя QDataStream заполнить QByteArray, В обоих случаях мне не удалось.

0

Решение

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"
4

Другие решения

Поскольку вы запрашиваете элегантный способ создания 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 должен оставаться в силе, а также. Несоблюдение этого требования также объясняет любую неудачу.

1

По вопросам рекламы [email protected]