VBcoders Guest



Don't have an account yet? Register
 


Forgot Password?



Bit IO

by Derek Haas (4 Submissions)
Category: Files/File Controls/Input/Output
Compatability: Visual Basic 3.0
Difficulty: Unknown Difficulty
Date Added: Wed 3rd February 2021
Rating: (2 Votes)

This module allows you to view a file as a collection of bits rather than as a collection of bytes. It allows you to read/write a single bit at a time or read/write up to 32 bits at once.

Inputs
It's all explained in the code
Code Returns
Same as above
Side Effects
Don't try writing to a file opened for reading, and don't try reading from a file opened for writing - there is no error checking for that and the results are unpredictable. Don't try to read or write more than 32 bits at a time with the InputBits and OutputBits functions. If you try to write a value with less bits than that value requires, the correct value will not be written. For example, don't try to write the value 32 into a file using only 4 bits. After every call to inputbits and inputbit, you should check for eof on the input file using this code: 'inputbit/inputbits call here if eof(bitfile.filenum) = True then 'replace bitfile with the name of the variable 'put code to exit loop or leave function here end if

Rate Bit IO

Type BitFile
  FileNum As Integer 'File handle
  holder As Byte   'holds a byte from file
  mask As Byte    'used to read bits
End Type

Public Function OpenOBitFile(FileName As String) As BitFile
'Parameters - Filename
'Returns - Bitfile
'What it does - Opens a file for output a single bit at a time
'Example -  dim OutputFile as bitfile
'      OutputFile = OpenOBitFile("C:\test.bit")
 
 Dim bitfilename As BitFile
  FileNum = FreeFile             'get lowest available file handle
  Open FileName For Binary As FileNum     'open it
  bitfilename.FileNum = FileNum        'assign file number to structure
  bitfilename.holder = 0           'bit holder = 0
  bitfilename.mask = 128           'used to read individual bits
  OpenOBitFile = bitfilename
End Function
Public Function OpenIBitFile(FileName As String) As BitFile
'Parameters - Filename
'Returns - Bitfile
'What it does - Opens a file for input a single bit at a time
'Example -  dim InputFile as bitfile
'      InputFile = OpenIBitFile("C:\command.com")
  Dim bitfilename As BitFile
  FileNum = FreeFile             'get lowest available file handle
  Open FileName For Binary As FileNum     'open it
  bitfilename.FileNum = FileNum        'assign file number to structure
  bitfilename.holder = 0           'bit holder = 0
  bitfilename.mask = 128           'used to read individual bits
  OpenIBitFile = bitfilename
End Function
Public Sub CloseIBitFile(bitfilename As BitFile)
'Parameters - bitfile
'Returns - Nothing
'What it does - Closes the file associated with a bitfile
'Example - CloseIBitFile(InputFile)
  Close bitfilename.FileNum          'Close the file associated with the bitfile
End Sub
Public Sub CloseOBitFile(bitfilename As BitFile)
'Parameters - bitfile
'Returns - Nothing
'What it does - Closes the file associated with a bitfile
'Example - CloseOBitFile(OutputFile)
  If bitfilename.mask <> 128 Then    'If there is unwritten data...
    Put bitfilename.FileNum, , bitfilename.holder  'Write it now
  End If
      
  Close bitfilename.FileNum    'Close the file
End Sub
Public Sub OutputBit(ByRef bitfilename As BitFile, bit As Byte)
'Parameters - bitfile, bit to write
'Returns - nothing
'What it does - Writes the specified bit to the file
'Example - OutputBit(OutputFile, 1)
  If bit <> 0 Then
    bitfilename.holder = bitfilename.holder Or bitfilename.mask
    'the holder stores up written bits until there are 8
    'At that point vb's normal file handling facilities can write it
  End If
  bitfilename.mask = bitfilename.mask \ 2 'decrease mask by power of 2
  If bitfilename.mask = 0 Then           'if mask is empty
    Put bitfilename.FileNum, , bitfilename.holder 'write the byte
    bitfilename.holder = 0            'reset holder and mask
    bitfilename.mask = 128
    
  End If
 
End Sub
Public Sub OutputBits(ByRef bitfilename As BitFile, ByVal code As Long, ByVal count As Integer)
'Parameters - bitfile, data to write, number of bits to use
'Returns - nothing
'What it does - Writes the specified info using the specified number of bits
'Example - OutputBits(OutputFile, 28, 7)
  Dim mask As Long
  mask = 2 ^ (count - 1)
  Do While mask <> 0
    If (mask And code) <> 0 Then      'if the bits match up...
      bitfilename.holder = bitfilename.holder Or bitfilename.mask 'put the bit in the holder
    End If
    bitfilename.mask = bitfilename.mask \ 2
    mask = mask \ 2
    If bitfilename.mask = 0 Then    'when there are 8 bits, write the holder to the file
      Put bitfilename.FileNum, , bitfilename.holder
      bitfilename.holder = 0     'and reset the holder and mask
      bitfilename.mask = 128
    End If
  Loop
End Sub
Public Function InputBit(ByRef bitfilename As BitFile) As Byte
'Parameters - bitfile
'returns - the next bit from the file
'Example: bit = InputBit(InputBitFile)

  Dim value As Byte
  If bitfilename.mask = 128 Then           'if at end of previous byte
   
    Get bitfilename.FileNum, , bitfilename.holder  'get a new byte from file
  End If
  value = bitfilename.holder And bitfilename.mask   'get the bit
  bitfilename.mask = bitfilename.mask \ 2       'move the mask bit down one
  If bitfilename.mask = 0 Then
    bitfilename.mask = 128
  End If
  If value <> 0 Then                 'return 0 or 1 depending on value
    InputBit = 1
  Else
    InputBit = 0
  End If
End Function
Public Function InputBits(ByRef bitfilename As BitFile, count As Integer) As Long
'Parameters - bitfile, number of bits to read
'returns - the value of the next count bits in the bitfile
'Example: byte = InputBits(InputBitFile, 8)
'This function works just like inputbit except that it loops through and reads the specified
'number of bits and puts them into a temporary holder
  Dim holder As Long
  Dim longmask As Long
  
  longmask = 2 ^ (count - 1)
  
  Do While (longmask <> 0)
    If bitfilename.mask = 128 Then
 
      Get bitfilename.FileNum, , bitfilename.holder
    End If
    If (bitfilename.holder And bitfilename.mask) <> 0 Then
      holder = holder Or longmask
    End If
    bitfilename.mask = bitfilename.mask \ 2
    longmask = longmask \ 2
    If bitfilename.mask = 0 Then
      bitfilename.mask = 128
    End If
  Loop
 
  InputBits = holder
End Function

Download this snippet    Add to My Saved Code

Bit IO Comments

No comments have been posted about Bit IO. Why not be the first to post a comment about Bit IO.

Post your comment

Subject:
Message:
0/1000 characters