C++ Qt5.6でQBufferを作成する最もシンプルでエレガントな方法を、void * data
とlong data_size
から探しています。QBufferからvoidポインタとメモリサイズ
私は、QByteArray::fromRawData()
を使ってvoidをキャストし、を使ってQByteArray
を書き込もうとしました。どちらの場合も私は成功しませんでした。
C++ Qt5.6でQBufferを作成する最もシンプルでエレガントな方法を、void * data
とlong data_size
から探しています。QBufferからvoidポインタとメモリサイズ
私は、QByteArray::fromRawData()
を使ってvoidをキャストし、を使って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デバイスであることを覚えておいてください。これは機能するためには開く必要があります。簡単なテストは、期待どおりに動作することを示しています
QBuffer buffer;
buffer.setData(static_cast<const char*>(data), data_size);
注:
あなたがデータとDATA_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"
、私は単純にこれを使用することになり、これをコピーdata
が指すメモリをコピーします。
私は多分あなたはQByteArray::fromRawData
ためdata_size
としてsize引数を追加するのを忘れ、あなたが成功することができない理由はわかりませんか?その場合、サイズを計算するのにstrlen(data)
が使用されます。
そして、あなたはこのようなものを使用している場合:QBufferが破壊されるまで
QByteArray byteArray = QByteArray::fromRawData(static_cast<const char*>(data), data_size);
QBuffer buffer(&byteArray);
はその後byteArray
は有効でなければなりません。 QByteArray::fromRawData(...)
はコピーされないので、data
が指すメモリも有効なままでなければなりません。その要件を満たさないと失敗を説明することもできます。
「私は成功しませんでした」とはどういう意味ですか?あなたは何かエラーを起こしましたか? – dtech
QBufferを使ってオーディオを再生していますが、これまでのところ、ノイズや沈黙しか得られません。 charポインタにキャストすると、プロセスのどこかでバッファアンダーランが発生します。 – gro
QByteArray :: fromRawDataがバッファをQByteArrayにコピーしなかったのは知っていますか?このメソッドを使用すると、QByteArrayはポインタを使用します。 – Unick