Seite 1 von 1

Seltsames Verhalten beim Setzen von Bits

Verfasst: 25. Februar 2014 19:23
von m-obi
Hallo,

ich habe ein seltsames Verhalten beim Setzen von Bits in einem QByteArray.
Kann mir das jemand erklären? Also das am Ende.

Code: Alles auswählen

SetBit1:    "00000000" 
SetBit2:    "00000001" 
-------------------------- 
ClearBit1:  "00000001" 
ClearBit2:  "00000000" 
------------------------------ 
SetBit1:    "00000000" 
SetBit2:    "00000010" 
-------------------------- 
ClearBit1:  "00000010" 
ClearBit2:  "00000000" 
------------------------------ 
SetBit1:    "00000000" 
SetBit2:    "00000100" 
-------------------------- 
ClearBit1:  "00000100" 
ClearBit2:  "00000000" 
------------------------------ 
SetBit1:    "00000000" 
SetBit2:    "00001000" 
-------------------------- 
ClearBit1:  "00001000" 
ClearBit2:  "00000000" 
------------------------------ 
SetBit1:    "00000000" 
SetBit2:    "00010000" 
-------------------------- 
ClearBit1:  "00010000" 
ClearBit2:  "00000000" 
------------------------------ 
SetBit1:    "00000000" 
SetBit2:    "00100000" 
-------------------------- 
ClearBit1:  "00100000" 
ClearBit2:  "00000000" 
------------------------------ 
SetBit1:    "00000000" 
SetBit2:    "01000000" 
-------------------------- 
ClearBit1:  "01000000" 
ClearBit2:  "00000000" 
------------------------------ 
SetBit1:    "00000000" 
SetBit2:    "1111111111111111111111111111111111111111111111111111111110000000" 
-------------------------- 
ClearBit1:  "1111111111111111111111111111111111111111111111111111111110000000" 
ClearBit2:  "00000000" 
------------------------------
Der Testcode ist dieser:

Code: Alles auswählen

#include <QCoreApplication>
#include <QDebug>

void SetBit(QByteArray &data, int byte, int bit);
void ClearBit(QByteArray &data, int byte, int bit);

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QByteArray Test;

    for (int i = 0; i < 8; ++i) {
        SetBit(Test, 0, i);
        ClearBit(Test, 0, i);
    }

    return a.exec();
}

void SetBit(QByteArray &data, int byte, int bit)
{
    qDebug() << "SetBit1:   " << QString("%1").arg(data[byte], 8, 2, QChar('0'));
    data[byte] = data[byte] | (1 << bit);
    qDebug() << "SetBit2:   " << QString("%1").arg(data[byte], 8, 2, QChar('0'));
    qDebug() << "--------------------------";
}

void ClearBit(QByteArray &data, int byte, int bit)
{
    qDebug() << "ClearBit1: " << QString("%1").arg(data[byte], 8, 2, QChar('0'));
    data[byte] = data[byte] & ~(1 << bit);
    qDebug() << "ClearBit2: " << QString("%1").arg(data[byte], 8, 2, QChar('0'));
    qDebug() << "------------------------------";
}
Ich sitze nun schon einige Stunden dran seit gestern. Aber ich finde einfach den Fehler nicht.

Re: Seltsames Verhalten beim Setzen von Bits

Verfasst: 26. Februar 2014 00:07
von veeman
Der []-Operator von QByteArray liefert einen (signed) char.
Dieser wird impliziert in einen signed long konvertiert und an die Funktion übergeben.
Die Ausgabe entspricht der 32Bit Darstellung des 8Bit vorzeichenbehafteten Typs.

Konvertier es in ein unsigned dann wird es richtig dargestellt.

C-Style:

Code: Alles auswählen

(unsigned char)data[byte]

Re: Seltsames Verhalten beim Setzen von Bits

Verfasst: 26. Februar 2014 07:43
von m-obi
Danke klappt super.

Re: Seltsames Verhalten beim Setzen von Bits

Verfasst: 28. Februar 2014 06:50
von m-obi
Hab noch in Problem :roll:
Unzwar clear ich nur das Bit 7.0.
Aber komischerweise sind Bits von anderen Bytes gesetzt.

Code: Alles auswählen

#include <QCoreApplication>
#include <QDebug>

void SetBit(QByteArray &data, int byte, int bit);
void ClearBit(QByteArray &data, int byte, int bit);

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QByteArray Test2;
    Test2.reserve(1024);

    QByteArray Test;
    Test.reserve(1024);

    Test = Test2;

    ClearBit(Test, 7, 0);

    qDebug() << "Byte 0:   " << QString("%1").arg((unsigned char)Test[0], 8, 2, QChar('0'));
    qDebug() << "Byte 1:   " << QString("%1").arg((unsigned char)Test[1], 8, 2, QChar('0'));
    qDebug() << "Byte 2:   " << QString("%1").arg((unsigned char)Test[2], 8, 2, QChar('0'));
    qDebug() << "Byte 3:   " << QString("%1").arg((unsigned char)Test[3], 8, 2, QChar('0'));
    qDebug() << "Byte 4:   " << QString("%1").arg((unsigned char)Test[4], 8, 2, QChar('0'));
    qDebug() << "Byte 5:   " << QString("%1").arg((unsigned char)Test[5], 8, 2, QChar('0'));
    qDebug() << "Byte 6:   " << QString("%1").arg((unsigned char)Test[6], 8, 2, QChar('0'));
    qDebug() << "Byte 7:   " << QString("%1").arg((unsigned char)Test[7], 8, 2, QChar('0'));

    return a.exec();
}

void SetBit(QByteArray &data, int byte, int bit)
{
    data[byte] = data[byte] | (1 << bit);
}

void ClearBit(QByteArray &data, int byte, int bit)
{
    data[byte] = data[byte] & ~(1 << bit);
}

Re: Seltsames Verhalten beim Setzen von Bits

Verfasst: 1. März 2014 20:32
von veeman
Die Funktion reserve Reserviert nur den Speicher.

Deren Inhalt ist jedoch nicht initialisiert und enthält Datenmüll, deswegen steht da irgendwas drin.
Desweiteren wird die Größe nicht geändert. Sprich diese bleibt Null und deine Zugriffe über den []-Operator laufen irgendwo in den RAM.
Besser: ua. resize verwenden.
Und: den Speicher mit gültigen Werten initialisieren.

Code: Alles auswählen

Test2.resize(1024);
  for (int i=0; i<20;++i)
    Test2[i] = 0;
Die Zuweisung eines QByteArray zu einem anderen erstellt nicht wie vielleicht vermutet eine Kopie sondern eine Referenz auf das Ursprüngliche Objekt.
Dh. Änderungen im einen wirken sich aufs andere aus. Hier war irgendwo nen Thread wo nen Befehl genannt wurde wie man das Entkoppeln kann....

Re: Seltsames Verhalten beim Setzen von Bits

Verfasst: 1. März 2014 21:41
von m-obi
Das mit resize hab ich auch inzwischen rausgefunden.
Das kopieren klappt anscheinend mit clear zuerst und dann mit append.

Re: Seltsames Verhalten beim Setzen von Bits

Verfasst: 2. März 2014 09:34
von Christian81
veeman hat geschrieben: Die Zuweisung eines QByteArray zu einem anderen erstellt nicht wie vielleicht vermutet eine Kopie sondern eine Referenz auf das Ursprüngliche Objekt.
Dh. Änderungen im einen wirken sich aufs andere aus. Hier war irgendwo nen Thread wo nen Befehl genannt wurde wie man das Entkoppeln kann....
Der fett rot markierte Satz ist definitiv falsch!

Re: Seltsames Verhalten beim Setzen von Bits

Verfasst: 2. März 2014 11:55
von veeman
Ja hast recht, hatte das noch mit was anderem im Gedächtnis > data()[]