ReadBits und WriteBits
Übersicht

![]() |
HolzchopfMeisterpackerBetreff: ReadBits und WriteBits |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group