0

void * dataとから C++ Qt5.6 で QBuffer を作成する最もシンプルでエレガントな方法を探していますlong data_size

void を char ポインターにキャストし、 をQByteArray::fromRawData()使用QDataStreamして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)、バイト配列ステップがまったく必要ないものもあります。

最後に、これは IO デバイスであることを忘れないで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"
于 2016-03-29T12:53:54.360 に答える
1

data と data_size から QBuffer を作成するエレガントな方法を求めているので、単純にこれを使用します。

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

注: これにより、 が指すメモリがコピーdataされます。


なぜあなたが成功できないのか分かりません.as data_sizesize引数を追加するのを忘れたのかもしれませんQByteArray::fromRawData? その場合strlen(data)、サイズの計算に使用されます。

そして、次のようなものを使用している場合:

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

その後、byteArrayQBuffer が破棄されるまで有効である必要があります。また、QByteArray::fromRawData(...)はコピーしないため、 が指すメモリdataも有効なままでなければなりません。その要件を満たさないことも、失敗を説明します。

于 2016-03-29T13:19:27.180 に答える