2016-03-29 8 views
0

Ich bin auf der Suche nach der einfachsten und oder elegantesten Möglichkeit, einen QBuffer in C++ Qt5.6 von void * data und long data_size zu erstellen.QBuffer von void pointer und Speichergröße

Ich versuchte, die Lücke auf einen Char-Zeiger zu werfen und die QByteArray::fromRawData() sowie QDataStream zu verwenden, um eine QByteArray zu füllen. In beiden Fällen war ich nicht erfolgreich.

+2

Was bedeutet "ich nicht erfolgreich"? Hast du einen Fehler oder etwas bekommen? – dtech

+0

Ich benutze den QBuffer um Audio zu spielen und in jedem Fall bekomme ich nur Rauschen oder Stille. Wenn ich auf einen Char-Zeiger umsetze, erhalte ich irgendwo während des Prozesses einen Puffer-Unterlauf. – gro

+0

Wissen Sie, was QByteArray :: fromRawData Puffer nicht in QByteArray kopiert hat? Mit dieser Methode verwendet QByteArray Ihren Zeiger. – Unick

Antwort

3

QByteArray::QByteArray(const char *data, int size) wird die Daten kopieren.

QByteArray::fromRawData(const char *data, int size) werden die bereits vorhandenen Daten verwendet.

Je nach Implementierung kann das Kopieren der Daten zu Problemen führen.

Nachdem Sie die Daten in einem Byte-Array haben, gibt es mehrere Wege zu gehen, können Sie direkt einen Puffer aufbauen:

QBuffer(QByteArray *byteArray, QObject *parent = Q_NULLPTR) 

oder wahrscheinlicher, da Sie Audio spielen, möchten Sie vielleicht die Wiederverwendung und der gleiche Puffer eine der folgenden Optionen verwenden, um es aufzufüllen:

setBuffer(QByteArray *byteArray) 
setData(const QByteArray &data) 

Schließlich gibt es auch void QBuffer::setData(const char *data, int size), für die Sie brauchen nicht einmal das Byte-Array Schritt überhaupt.

Schließlich, denken Sie daran, dass QBuffer ein IO-Gerät ist - es muss geöffnet werden, damit es funktioniert. Ein schneller Test zeigt, dass es wie erwartet funktioniert:

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

Da Sie für eine elegante Art und Weise fordern eine QBuffer von Daten und data_size zu erstellen, würde ich einfach verwenden:

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

Hinweis: Diese Kopien der Speicher, auf den data zeigt.


Ich habe keine Ahnung, warum Sie nicht in der Lage sind erfolgreich zu sein, vielleicht haben Sie die data_size als Größe Argument für QByteArray::fromRawData hinzuzufügen vergessen? In diesem Fall würde strlen(data) verwendet werden, um die Größe zu berechnen.

Und wenn Sie so etwas wie dieses verwenden:

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

Dann wird der byteArray muss gültig bleiben, bis der QBuffer zerstört wird. Und da QByteArray::fromRawData(...) nicht kopiert wird, muss der Speicher, auf den data zeigt, ebenfalls gültig bleiben. Würde diese Anforderung nicht erfüllt, würde dies auch einen Fehler erklären.

Verwandte Themen