113 lines
2.8 KiB
Plaintext
113 lines
2.8 KiB
Plaintext
Type BitFilter
|
|
nombre As String
|
|
accu As Integer
|
|
bits As Integer
|
|
bw As Integer
|
|
br As Integer
|
|
offset As Integer
|
|
End Type
|
|
|
|
Sub openWriter(bf As BitFilter)
|
|
bf.bw = Freefile
|
|
Open bf.nombre For Binary Access Write As #bf.bw
|
|
End Sub
|
|
|
|
Sub openReader(bf As BitFilter)
|
|
bf.br = Freefile
|
|
Open bf.nombre For Binary Access Read As #bf.br
|
|
bf.offset = 0
|
|
End Sub
|
|
|
|
Sub escribe(bf As BitFilter, buf() As Byte, start As Integer, nBits As Integer, shift As Integer)
|
|
Dim As Integer index = start + (shift \ 8)
|
|
shift Mod= 8
|
|
While nBits <> 0 Or bf.bits >= 8
|
|
While bf.bits >= 8
|
|
bf.bits -= 8
|
|
Dim As Byte outByte = ((bf.accu Shr bf.bits) And &hFF)
|
|
Put #bf.bw, , outByte
|
|
Wend
|
|
While bf.bits < 8 And nBits <> 0
|
|
Dim As Byte b = buf(index)
|
|
bf.accu = (bf.accu Shl 1) Or (((128 Shr shift) And b) Shr (7 - shift))
|
|
nBits -= 1
|
|
bf.bits += 1
|
|
shift += 1
|
|
If shift = 8 Then
|
|
shift = 0
|
|
index += 1
|
|
End If
|
|
Wend
|
|
Wend
|
|
End Sub
|
|
|
|
Sub lee(bf As BitFilter, buf() As Byte, start As Integer, nBits As Integer, shift As Integer)
|
|
Dim As Integer index = start + (shift \ 8)
|
|
shift Mod= 8
|
|
While nBits <> 0
|
|
While bf.bits <> 0 And nBits <> 0
|
|
Dim As Byte mask = 128 Shr shift
|
|
buf(index) = Iif((bf.accu And (1 Shl (bf.bits - 1))) <> 0, (buf(index) Or mask) And &hFF, (buf(index) And Not mask) And &hFF)
|
|
nBits -= 1
|
|
bf.bits -= 1
|
|
shift += 1
|
|
If shift >= 8 Then
|
|
shift = 0
|
|
index += 1
|
|
End If
|
|
Wend
|
|
If nBits = 0 Then Exit Sub
|
|
Dim As Byte inByte
|
|
Get #bf.br, bf.offset + 1, inByte
|
|
bf.accu = (bf.accu Shl 8) Or inByte
|
|
bf.bits += 8
|
|
bf.offset += 1
|
|
Wend
|
|
End Sub
|
|
|
|
Sub closeWriter(bf As BitFilter)
|
|
If bf.bits <> 0 Then
|
|
bf.accu Shl= (8 - bf.bits)
|
|
Dim As Byte outByte = (bf.accu And &hFF)
|
|
Put #bf.bw, , outByte
|
|
End If
|
|
Close #bf.bw
|
|
bf.accu = 0
|
|
bf.bits = 0
|
|
End Sub
|
|
|
|
Sub closeReader(bf As BitFilter)
|
|
Close #bf.br
|
|
bf.accu = 0
|
|
bf.bits = 0
|
|
bf.offset = 0
|
|
End Sub
|
|
|
|
Dim As Integer i
|
|
Dim As BitFilter bf
|
|
bf.nombre = "test.bin"
|
|
|
|
' for each byte in s, write 7 bits skipping 1
|
|
Dim As Byte s(10) => {Asc("a"), Asc("b"), Asc("c"), Asc("d"), _
|
|
Asc("e"), Asc("f"), Asc("g"), Asc("h"), Asc("i"), Asc("j"), Asc("k")}
|
|
openWriter(bf)
|
|
For i = 0 To Ubound(s)
|
|
escribe(bf, s(), i, 7, 1)
|
|
Next i
|
|
closeWriter(bf)
|
|
|
|
' read 7 bits and expand to each byte of s2 skipping 1 bit
|
|
openReader(bf)
|
|
Dim As Byte s2(0 To Ubound(s)) = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
|
For i = 0 To Ubound(s2)
|
|
lee(bf, s2(), i, 7, 1)
|
|
Next i
|
|
closeReader(bf)
|
|
|
|
For i = 0 To Ubound(s2)
|
|
Print Chr(s2(i));
|
|
Next i
|
|
Print
|
|
|
|
Sleep
|