VB6.0: Einz. Bits aus Binärdatei mit VB auslesen

Hallo Leute,

wie ich eine binäre Datei auslese weiss ich mittlerweilen.
Bytes, Integer, Long Werte alles kein Problem.
Jetzt stehe ich vor dem Problem, ein 2-Byte großes Bitfeld
auslesen zu müssen. Das Feld teilt sich auf in 13 Bit (bit 0-12) und 3 Bit (bit 13-15). Wie kriege ich mit VB raus was da jeweils einzeln drinnsteckt ??

Vielen Dank für eure Hilfe

Gruß

Tom

Hallo Thomas,

zuerst lädts Du diese zwei Bytes. Um an die Bits 0-12
ranzukommen verwendest Du eine Bitmaske, die die oberen
drei Bits rausschmeißt:

buf ist der Puffer, in den Du die zwei Bytes aus der Datei eingelesen hast.

dim buf as integer
buf = holezweibytes()

bits0_12 = buf AND ((2^13) - 1)

die letzten drei Bits erhälst Du, indem buf um 13 Stellen nach rechts geschoben wird, aber ich habe keine Ahnung, wie das in VB geht. Gewöhnlich schreibt man auch nicht ((2^13)-1), sondern den Ergebniswert als Hexadezimalzahl, aber auch hier weiß ich nicht mehr wie man das in VB macht.

Gruß Patrick

Hi Thomas,

Jetzt stehe ich vor dem Problem, ein 2-Byte großes Bitfeld
auslesen zu müssen. Das Feld teilt sich auf in 13 Bit (bit
0-12) und 3 Bit (bit 13-15). Wie kriege ich mit VB raus was da
jeweils einzeln drinnsteckt ??

Angenommen, Du hast die 2 Byte in eine Long-Zahl i eingelesen. Um die Bits zu extrahieren, musst Du sie - wie schon zuvor geschrieben - mit Bitmasken „herausholen“. Bit n bekommst Du, indem Du den Wert

bit_n = i AND 2^n

berechnest (beachte hier, dass in VB logische und boolsche ANDs gleich sind im Gegensatz zu C++ z.B., hier ist es && und &amp:wink:

Hier erhältst Du etwa bei 10 = %1010 (Binärschreibweise) und bit 1:

bit_1 = 10 AND 2^1 = 2.

Interessiert Dich nur, ob das Bit gesetzt ist und nicht dessen Wert, musst Du durch diesen noch dividieren:

bit_n_gesetzt = (10 AND 2^n)/2^n

Das ergibt 1 oder 0.

So, nun zu Deinem Problem:
Die Zahlen aus den Bits 0…12 bzw. 13-15 erhältst Du wie folgt:

bits_0_12 = (i AND (%1111111111111000))/(%1000) = (i AND 65528)/8
bits_13_15 = i AND (%111) = i AND 7,

wenn die Bits in der Reihenfolge des Bitstroms bezeichnet sind, ansonsten:

bits_0_12r = i AND (%1111111111111) = i AND 4095
bits_13_15r = (i AND (%1110000000000000))/(%10000000000000) = (i AND 57344)/8192,

VB erkennt leider keine Binärzahlen, ich habe sie nur der Übersichtlichkeit hingeschrieben.

Hoffe, das hat Dir geholfen, wenn Du noch Fragen hast oder irgendwas nicht funktioniert, melde Dich nochmal.

Viele Grüße
Sculpture