Seite 1 von 1

Bug in QBitArray

Verfasst: 5. November 2009 10:37
von tilo
Hi,

mir ist ein Problem aufgefallen, dass nur eintritt, wenn folgende Bedingungen erfüllt sind:
1. wenn man ein QBitArray verkleinert auf ein nicht durch 8 teilbaren Wert, d.h. es sind überzählige Bits im letzten Byte
2. es mind. 1 dieser überzähligen Bits vorher gesetzt war
3. das QBitArray über ein QDataStream neu gelesen wird
tritt offensichtlich ein Lesefehler auf und man erhält ein QBitArray der Größe 0.
Der folgende Code verdeutlicht dies:

Code: Alles auswählen

    QBitArray ba_1(20, true), ba_2;
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream stream(&buffer);
    ba_1.resize(ba_1.size()-1);
    stream << ba_1;
    buffer.seek(0);
    stream >> ba_2;
    qDebug() << ba_2.size();
Die überzähligen Bits bleiben auch nach einer Zuweisung oder Neuerzeugung (ba_2 = ba_1 bzw. QBitArray ba_2(ba_1) ) erhalten. Dieses Problem lässt sich umgehen, indem man vor dem resize() (oder truncate() ) alle überzähligen Bits löscht, z.B. mit:
fill( false, newSize, oldSize)

Wie gesagt, Probleme treten erst nach dem Auslesen aus einem Stream auf (z.B. aus Datei lesen), sonst sind oben besagte Bits nicht relevant.
Ich hoffe, ich hab nix übersehen - vielen Dank für Hinweise im Vorraus

Verfasst: 5. November 2009 12:16
von upsala
Dieses Forum ist in PHP programmiert und verwendet kein QBitArray...

Verfasst: 5. November 2009 12:18
von AuE
rofl

Verfasst: 5. November 2009 12:20
von tilo
upsala hat geschrieben:Dieses Forum ist in PHP programmiert und verwendet kein QBitArray...
???
das ist doch qtforum.de, oder?

Verfasst: 5. November 2009 13:04
von Christian81
tilo hat geschrieben:
upsala hat geschrieben:Dieses Forum ist in PHP programmiert und verwendet kein QBitArray...
???
das ist doch qtforum.de, oder?
Aber er war im Unterforum 'Das Forum' ...

Verfasst: 5. November 2009 14:47
von neuschi
Das sieht tatsächlich nach einem Qt-Bug aus, und zwar in

Code: Alles auswählen

QDataStream &operator>>(QDataStream &in, QBitArray &ba)
Hier steht folgender Code:

Code: Alles auswählen

int paddingMask = ~((0x1 << (len & 0x7)) - 1);
if (paddingMask != ~0x0 && (ba.d.constData()[ba.d.size() - 1] & paddingMask)) {
        ba.clear();
        in.setStatus(QDataStream::ReadCorruptData);
        return in;
    }
In den if-Zweig geht er nur rein, wenn du in deinem Beispiel ba_1 mit true initialisierst.

Schick dein Beispiel doch mal an support@trolltech.com (kA, ob support@qt.nokia.com auch geht)

\Ralf

Verfasst: 5. November 2009 18:25
von upsala

Verfasst: 5. November 2009 21:34
von tilo
neuschi hat geschrieben:Das sieht tatsächlich nach einem Qt-Bug aus, und zwar in

Code: Alles auswählen

QDataStream &operator>>(QDataStream &in, QBitArray &ba)
Schick dein Beispiel doch mal an support@trolltech.com (kA, ob support@qt.nokia.com auch geht)

\Ralf
Danke für den Hinweis. Ich hab es einfach mal geschickt.
Tilo