ReadBits und WriteBits

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Holzchopf

Meisterpacker

Betreff: ReadBits und WriteBits

BeitragFr, Apr 06, 2007 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Funktionen gammeln schon lange bei mir rum (obwohl gammeln der falsche Ausdruck ist, weil ich die selber sehr oft verwende).

Mit ihnen kann man einzelne Bits in eine Datei schreiben oder aus einer Datei auslesen.

Zu beachten gibt es nicht viel, nur:

- Es gibt keine SeekFile-Funktion, die ein bestimmtes Bit ansteuern kann, die müsste man wennschon selber schreiben.

- Da die Funktionen nur alle 8 Bits eine effektive Lese- /Schreiboperation durchführen, sollte man zwischen den einzelnen Bit-Funktionsaufrufen nicht noch ReadByte etc. ausführen (ausser man füllt den vorangehenden leeren Bitpuffer vorher noch auf)

- Was die einzelnen Funktionen machen, sollte eigentlich dem Quellcode entnehmbar sein.

- Nach der letzten Bit-Schreiboperation unbedingt FillBits() ausführen

- Die Funktionen können jeweils nur auf einen Dateistream zeitgleich angewendet werden (es sei denn, man beherrscht den Umgang mit FillBits() resp. ClearBitBuffer()


Und nun:
Code: [AUSKLAPPEN]
;*************************************************
;
;   Funktionen zum speichern von Bits
;
;*************************************************

Global BRW_S_BitSetByte      = 0
Global BRW_S_BitsSet      = 0
Global BRW_R_BitSetByte      = 0
Global BRW_R_BitsSet      = 0

;*************************************************

; Schreibt Bits in einen Buffer, wenn der Buffer
;   8 Bit lang ist, wird dieser gespeichert.
; Erwartet wird der Stream der Datei und ein Bit-
;   string, in dem die Bits in der Form "0011"
;   angegeben sind.
Function WriteBits( BRW_S_Stream, BRW_S_BitString$ )

   ; Wieviele Bits der String enthält
   BRW_S_LN = Len( BRW_S_BitString )
   
   For BRW_S_a = 1 To BRW_S_LN
      ; Das Bit in die Bitreihe setzen und Bitreihe
      ;   verschieben
      BRW_S_BitSetByte = BRW_S_BitSetByte Or ( Mid( BRW_S_BitString, BRW_S_a, 1 ) = "1" )
      BRW_S_BitSetByte = BRW_S_BitSetByte Shl 1
      
      BRW_S_BitsSet = BRW_S_BitsSet + 1
      
      ; Falls 8 Abgeschlossene Bits vorhanden sind,
      ;   diese in Datei schreiben
      If BRW_S_BitsSet = 8   
         WriteByte BRW_S_Stream, ( BRW_S_BitSetByte Shr 1 ) And $FF
         BRW_S_BitsSet = 0
         BRW_S_BitSetByte = 0
      EndIf
   Next
   
End Function

; Prüft, ob noch Bits im Buffer sind. Ist dies
;   der Fall, so werden Nullen hinten an den
;   Buffer gehängt, anschliessend wird der Buffer
;   gespeichert
Function FillBits( BRW_S_Stream )

   ; Wenn der Buffer leer ist, sofort abbrechen
   If BRW_S_BitsSet = 0 Then Return
   
   Repeat
      ; Die Bitreihe mit 0 füllen und Bitreihe
      ;   verschieben
      BRW_S_BitSetByte = BRW_S_BitSetByte Or 0
      BRW_S_BitSetByte = BRW_S_BitSetByte Shl 1
      
      BRW_S_BitsSet = BRW_S_BitsSet + 1
      
      ; Falls 8 Abgeschlossene Bits vorhanden sind,
      ;   diese in Datei schreiben und Funktion
      ;   beenden
      If BRW_S_BitsSet = 8
         WriteByte BRW_S_Stream, ( BRW_S_BitSetByte Shr 1 ) And $FF
         BRW_S_BitsSet = 0
         Return
      EndIf
   Forever
   
End Function

; Liest eine Anzahl Bits aus dem Buffer aus, wenn
;   der Buffer leer ist, wird ein neues Byte
;   in den Buffer gelesen.
Function ReadBits( BRW_R_Stream, BRW_R_Bits )

   BRW_R_Value = 0

   For BRW_R_a = 1 To BRW_R_Bits
   
      If BRW_R_BitsSet = 0
         BRW_R_BitSetByte = ReadByte( BRW_R_Stream )
         BRW_R_BitsSet = 8
      EndIf
      
      ; Das ( 9 - BRW_R_BitsSet )te Bit von rechts ermitteln
      BRW_R_Bit = ( BRW_R_BitSetByte Shr ( BRW_R_BitsSet - 1 ) ) And 1
      BRW_R_Value = BRW_R_Value Or ( BRW_R_Bit Shl ( BRW_R_Bits - BRW_R_a ) )
      
      BRW_R_BitsSet = BRW_R_BitsSet - 1
      
   Next
   
   Return BRW_R_Value
   
End Function

; Leert den Bit-Buffer
Function ClearBitBuffer()
   
   BRW_R_BitsSet = 0
   BRW_R_BitSetByte = 0
   
End Function


Tipp des Tages: Als Datei abspeichern und per Include ins gewünschte Projekt einbinden. Schafft Übersicht.

MfG (Ich sollte unbedingt meine Platte mal wieder nach brauchbaren Codes durchstöbern)
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group