Seite 1 von 1

Bitzugriff aus einem QByteArray

Verfasst: 18. November 2008 11:29
von Marry
HI,
ich hab da ein kleines Problem mit QByteArray.
Ich lese Daten in einen QByteArray ein und bräuchte für die Verarbeitung die Bits der einzelnen Bytes.
Kann ich irgendwie ein QByteArray-Element in einen QBitArray einlesen.
Oder komm ich anders an die einzelnen 8 bits der bytes ran?

Danke schonmal für die Hilfe
mfg Marry

Verfasst: 18. November 2008 11:47
von macman
Warum liest Du die Daten in ein QByteArray, wenn Du ein QBitArray benötigst? Kannst sie doch gleich in ein QBitArray packen.

Verfasst: 18. November 2008 12:13
von Marry
Weil ich über eine Schnittstelle ein Protokoll mit 20 bytes bekomme und ich meist nur die bytes benötige.
So ist es meiner Meinung nach übersichtilicher und ich brauche nur in ganz bestimmten bytes die Einzelbits.
Außerdem liefert der Befehl readall meines wissens nach einen QByteArray zurück ;(
Naja ich hoffe mal das geht irgendwie ohne eine ganze Routine zu schreiben um den Wert in binär umzuwandeln und so auf die bits zuzugreifen.

Verfasst: 18. November 2008 12:26
von solarix
Naja ich hoffe mal das geht irgendwie ohne eine ganze Routine zu schreiben um den Wert in binär umzuwandeln und so auf die bits zuzugreifen.
umwandeln...? Warum nicht direkt:

Code: Alles auswählen

 QByteArray arr = ...
 if (arr[2] & 0x08)
   qDebug () << "viertes Bit von drittem Byte gesetzt";

Verfasst: 18. November 2008 12:37
von Marry
Ja das geht schon, aber dann brauche ich für 8 bit haufenweise Abfragen, um alle kombinationen abzudecken.
Wenn zb. das 3 bit in einem byte bedeuten würde "Status OK" und das vierte bit "Maschine läuft", könnten ja beide einzeln oder in Kombination auftreten. Also bräuchte ich hier alleine schon 3 Abfragen um die Zustände zu erfassen.
Wenn ich jedoch auf die einzelbits zugreife, könnte ich jedem Bit seine Bedeutung zuweisen und somit das ganze mit 2 Abfragen steuern.
Das würde sich bei 8 bit aufsummieren wenn die Bits in beliebigen Kombinationen auftreten können. Trotzdem danke für die Antwort ;)

Verfasst: 18. November 2008 12:50
von solarix
Du hast gefragt, wie du an die einzelnen Bits kommst.. damit kommst du auf einzelne Bits... schreib mal Pseudocode von dem, was du in Qt suchst (was du von einer Qt-Klasse wie QByteArray erwarten würdest)

[edit]
ich bin mir nicht sicher aber ich glaube, ich habe doch noch deine Interpretation meiner Lösung verstanden.. ich habe geschrieben "value & maske" .. nicht "value == maske"!

Verfasst: 18. November 2008 13:04
von macman
Marry hat geschrieben:Ja das geht schon, aber dann brauche ich für 8 bit haufenweise Abfragen, um alle kombinationen abzudecken.
Für 8 Bits brauchst Du 8 Abfragen, nicht mehr und nicht weniger.

Verfasst: 18. November 2008 13:07
von Marry
Ich bekomme zb. in meinem QByteArray array[2] den Wert 13, was binär 0000 1101 entsprechen würde. Jedes der gesetzten Bits hat eine bestimmte Bedeutung.
Ich hätte diesen Wert gerne in einen Bitarray, um dann über eine Abfrage
Bitarray bit[2] == 1 diesem bit eine Funktion zuzuweisen.
Zum Beispiel eine Schleife:
for (n=0 ; n<8; n++)
{
if (bit[n]==1)
{
if (n==2)
2tes bit gesetzt
if (n==3)
3tes bit gesetzt
.......
........
}

}

so könnte ich den gesetzten bits separat eine Funktion zuweisen.
Srs wenn ich mich nicht deutlich ausgedrückt habe ;(
Hoffe, dass es jetzt klar ist.

Verfasst: 18. November 2008 13:17
von Marry
Ah sry hatte mich mit der Antwort vertan ;(
Das funktioniert natürlich so ;)
Danke für die Antworten, hat mir sehr geholfen, auch wenn ich bischen auf der Leitung stand.

Verfasst: 18. November 2008 13:20
von solarix
Ja.. es ist klar was du möchtest und dass du dich nicht mit meinem Code befasst hast..

Code: Alles auswählen

if (array[2] & 0x01)
  // erstes bit gesetzt..
if (array[2] & 0x02)
  // zweites Bit gesetzt
if (array[2] & 0x04)
  // drittes Bit gesetzt
Schau dir Maskierungen mit binären Operatoren an....findest du in jedem 20-jährigen C-Tutorial...

[edit]
zu langsam :wink:

Verfasst: 18. November 2008 14:34
von VuuRWerK
Von rechts nach links die bits testen, ohne 8 if-abfragen zu schreiben:

Code: Alles auswählen

int n = 13; // 0000 1101
uint i;
for(i = 0; i < 8; i++) {
    if(n & (1 << i))
        printf("bit %d is set", i + 1);
}
:)

Gut Schuß
VuuRWerK ;)