Seltsames Verhalten beim Setzen von Bits

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
m-obi
Beiträge: 18
Registriert: 14. August 2013 07:46

Seltsames Verhalten beim Setzen von Bits

Beitrag 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.
Zuletzt geändert von m-obi am 26. Februar 2014 07:44, insgesamt 1-mal geändert.
Gruß m-obi
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Seltsames Verhalten beim Setzen von Bits

Beitrag 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]
m-obi
Beiträge: 18
Registriert: 14. August 2013 07:46

Re: Seltsames Verhalten beim Setzen von Bits

Beitrag von m-obi »

Danke klappt super.
Gruß m-obi
m-obi
Beiträge: 18
Registriert: 14. August 2013 07:46

Re: Seltsames Verhalten beim Setzen von Bits

Beitrag 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);
}
Gruß m-obi
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Seltsames Verhalten beim Setzen von Bits

Beitrag 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....
m-obi
Beiträge: 18
Registriert: 14. August 2013 07:46

Re: Seltsames Verhalten beim Setzen von Bits

Beitrag von m-obi »

Das mit resize hab ich auch inzwischen rausgefunden.
Das kopieren klappt anscheinend mit clear zuerst und dann mit append.
Gruß m-obi
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Seltsames Verhalten beim Setzen von Bits

Beitrag 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!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Seltsames Verhalten beim Setzen von Bits

Beitrag von veeman »

Ja hast recht, hatte das noch mit was anderem im Gedächtnis > data()[]
Antworten