bitzugriff auf eine long

Alles rund um die Programmierung mit Qt
Antworten
archon
Beiträge: 117
Registriert: 22. August 2006 12:01

bitzugriff auf eine long

Beitrag von archon »

Hallo Leute,

folgendes:

Ich möchte eine hex daten die in einer xml datei angelegt sind in den speicher holen dann binär bearbeiten und dann an eine andere klasse als bytearray schicken.

Ich bin nun schon soweit das die Daten von der xml datei (größe: 250Bit) als int32 (bei mir long) in einem puffer abliegen. Diese müssen jetzt so umgewandelt werden das ich die Daten auf der Bitebene bearbeiten kann. (bit setzten, bit löschen) . Habt ihr ihr mir bis hierhin vielleicht ein Vorschlag wie ich die int32 in ein feld (char? oder int8?) umwandel so dass ich einen zugriff auf die bits habe?

Gruss
Sebastian
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und wieso hast Du bei long keinen Zugriff auf die Bits?
Verwchselst Du nicht ggf. Bits und Bytes -> xml datei (größe: 250Bit) ist doch etwas wenig...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
archon
Beiträge: 117
Registriert: 22. August 2006 12:01

Beitrag von archon »

Hallo, danke für deine Antwort

also bei mir steht im dem xml file soetwas wie:

Code: Alles auswählen

- <page>
  <part-1 data="3FFFFFF" /> 
  <part-2 data="FFFFFFF" /> 
  <part-3 data="FFFFFFF" /> 
  <part-4 data="FFFFFFF" /> 
  <part-5 data="FFFFFFF" /> 
  <part-6 data="FFFFFFF" /> 
  <part-7 data="FFFFFFF" /> 
  <part-8 data="FFFFFFF" /> 
  <part-9 data="FFFFFFF" /> 
  </page>
eine ganze page hat demnach 250Bit (Hex: 3 und 62malF) (ich hab die parts als feld abgespeichert die müssen aber noch zusammengefügt werden)
(das xml file besteht aus mehreren pages)

jetzt weis ich nicht (weil ich noch laie bin) wie ich auf die bits zugreifen kann. Ich kann ja wohl jetzt schlecht alle 250Bit als eine int32 speichern und dann mit &= 0x...160mal0...1...50mal0... Bit setzten (oder hab ich da nen denkfehler). Weil ich sowas noch nie gemacht habe: Wie geht man den bei sowas vor?

Gruss
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ahso, jetzt habe ich es verstanden.
Nunja, ein wenig Rechnen musst du da schon müssen... ich würde es aber in long (oder besser qint32/quint32) lassen.
Die Daten würde ich entweder in ein Array von 9 longs einlesen (long myArray[9]) oder einen Qt-Container wie QVector benutzen.

Code: Alles auswählen

void setBit(quint32 *myArray, int iBitToSet)
{
  int idx = iBitToSet / 32; // rausfinden in welchen der quint32 - Werten sich das Bit versteckt
  int pos = iBitToSet % 32; // und jetzt die Position in dem quint32
  myArray[idx] |= (1 << pos);
}

void clearBit(quint32 *myArray, int iBitToClear)
{
  int idx = iBitToClear / 32;
  int pos = iBitToClear % 32;
  myArray[idx] &= ~(1 << pos);
}

bool isBitSet(quint32 *myArray, int iBitToTest)
{
  int idx = iBitToTest / 32;
  int pos = iBitToTest % 32;
  return ((myArray[idx] & (1 << pos)) != 0);
}
Das wars
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
archon
Beiträge: 117
Registriert: 22. August 2006 12:01

Beitrag von archon »

Vielen Dank...das ging ja wirklich flux!!

Also ich habe bereits in einem Array von fnav_src_buffer.page[0].part[0...8] jeweils die int32 werte von der xml importiert. Das Problem ist aber das es vorkommt das ich zum Beispiel in Bit 30 bis 35 eine Zahl reinschreiben muss sprich die parts überlappen sich.

Am leichtesten wäre es wenn ich alle 250Bits neben einander stehen hab. Dann kann ich einfach sagen das Bit 30 MSB und 35 LSB ist für eine Zahl sein soll.
Wenn aber Bit 0 bis 32 im part[0] steht und Bit 33 bis 64 in part[1] steht muss ich die letzten 3 bits von part[0]nehmen und die ersten 3 Bits von part[1] das erhöht schon nochmal den aufwand....Oder weisst du hierfür noch ne lösung?

Gruss
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Nicht direkt. Man kann aber auch Bitfeld-Strukturen definieren:

Code: Alles auswählen

struct myStruct {
  int bitField1 : 3;
  int bitField2 : 2;
  int bitField3 : 3;
  int bitField4 : 7;
  int bitField5 : 1;
}
Allerdings gibts da mit dem msvc probleme da er es alles als signed auffasst (beim wiederauslesen), auch weiss ich nicht ob ein Bitfeld dieser Grösse überhaupt funktioniert.

Oder Du schreibst dir noch einen Wrapper der die Position, die Anzahl an Bits und den Wert übernimmt und dann intern ausrechnet wo welches Bit hinmuss. So in der Art

Code: Alles auswählen

int iPos = 20;
int iBitCnt = 4;
int iValue = 7;
for(int i = 0; i < iBitCnt; i++) {
  if(iValue & (1 << i))
    setBit(iPos + i);
   else
    clearBit(iPos+i);
}
 
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
archon
Beiträge: 117
Registriert: 22. August 2006 12:01

Beitrag von archon »

Jo! Sowas hab ich mir schon gedacht... Die ganz Schosse muss später auch noch über nen CRC gehen werden sprich ich muss mir wirklich überlegen wie ich da über das ganze array fahre.
Das mit dem Wrapper find ich ne super idee...

Jo... ich denk das ich jetzt schon mit Deiner hilfe ganz gut zurechtkomme.

Wenns noch was gibt meld ich mich...

Thx!

Gruss
Sebastian
Antworten