2016-03-29 18 views
0

C++ Qt5.6でQBufferを作成する最もシンプルでエレガントな方法を、void * datalong data_sizeから探しています。QBufferからvoidポインタとメモリサイズ

私は、QByteArray::fromRawData()を使ってvoidをキャストし、を使ってQByteArrayを書き込もうとしました。どちらの場合も私は成功しませんでした。

+2

「私は成功しませんでした」とはどういう意味ですか?あなたは何かエラーを起こしましたか? – dtech

+0

QBufferを使ってオーディオを再生していますが、これまでのところ、ノイズや沈黙しか得られません。 charポインタにキャストすると、プロセスのどこかでバッファアンダーランが発生します。 – gro

+0

QByteArray :: fromRawDataがバッファをQByteArrayにコピーしなかったのは知っていますか?このメソッドを使用すると、QByteArrayはポインタを使用します。 – Unick

答えて

3

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

、私は単純にこれを使用することになり、これをコピー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が指すメモリも有効なままでなければなりません。その要件を満たさないと失敗を説明することもできます。

関連する問題