Seite 1 von 1
bitzugriff auf eine long
Verfasst: 2. Mai 2007 13:21
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
Verfasst: 2. Mai 2007 13:27
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...
Verfasst: 2. Mai 2007 13:36
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
Verfasst: 2. Mai 2007 13:46
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
Verfasst: 2. Mai 2007 14:36
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
Verfasst: 2. Mai 2007 14:47
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);
}
Verfasst: 2. Mai 2007 14:58
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