Bitzugriff aus einem QByteArray
Bitzugriff aus einem QByteArray
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
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
Warum liest Du die Daten in ein QByteArray, wenn Du ein QBitArray benötigst? Kannst sie doch gleich in ein QBitArray packen.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
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.
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.
umwandeln...? Warum nicht direkt: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.
Code: Alles auswählen
QByteArray arr = ...
if (arr[2] & 0x08)
qDebug () << "viertes Bit von drittem Byte gesetzt";
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
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
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"!
[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"!
Für 8 Bits brauchst Du 8 Abfragen, nicht mehr und nicht weniger.Marry hat geschrieben:Ja das geht schon, aber dann brauche ich für 8 bit haufenweise Abfragen, um alle kombinationen abzudecken.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
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.
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.
Ja.. es ist klar was du möchtest und dass du dich nicht mit meinem Code befasst hast..
Schau dir Maskierungen mit binären Operatoren an....findest du in jedem 20-jährigen C-Tutorial...
[edit]
zu langsam
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
[edit]
zu langsam
Von rechts nach links die bits testen, ohne 8 if-abfragen zu schreiben:

Gut Schuß
VuuRWerK
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
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)