📄 comp_lzsslazy.bas
字号:
Next
End If
Call AddToHistory(AddText)
Loop
ReDim ByteArray(Stream(0).Position - 1)
For X = 0 To Stream(0).Position - 1
ByteArray(X) = Stream(0).Data(X)
Next
End Sub
Private Sub AddToHistory(AddText As String)
If Len(History) + Len(AddText) < MaxHistory Then
History = History & AddText
AddText = ""
Exit Sub
ElseIf Len(History) < MaxHistory Then
HistPos = Len(History)
History = History & Left(AddText, MaxHistory - Len(History))
AddText = Mid(AddText, MaxHistory - HistPos + 1)
HistPos = 1
End If
Do
If HistPos + Len(AddText) < MaxHistory Then
Mid(History, HistPos, Len(AddText)) = AddText
HistPos = HistPos + Len(AddText)
AddText = ""
Else
If HistPos <= MaxHistory Then
Mid(History, HistPos, MaxHistory - HistPos + 1) = Left(AddText, MaxHistory - HistPos + 1)
AddText = Mid(AddText, MaxHistory - HistPos + 2)
End If
HistPos = 1
End If
Loop While AddText <> ""
End Sub
Private Function Check_For_Better_Match(DataArray() As Byte, Data As String, Position As Long) As Boolean
Dim SearchStr As String
Dim TempHistory As String
Dim TempHistPos As Long
Dim TempMaxHistory As Long
Dim StartFrom As Long
Dim StartPos As Long
Dim MaxPos As Long
Dim NuPos As Long
Dim StartBitGain As Integer
Dim NewBitGain As Integer
Dim X As Long
If Len(Data) > 255 Then Exit Function
'make backup of variables
TempHistory = History
TempHistPos = HistPos
TempMaxHistory = MaxHistory
StartFrom = Position - Len(Data)
MaxPos = Position
'store the first byte into history
Call AddToHistory(Chr(DataArray(StartFrom)))
StartPos = StartFrom + 1
NuPos = StartPos
StartBitGain = Len(Data) * 8 - 24
SearchStr = ""
Do While NuPos <= UBound(DataArray) And StartPos < MaxPos
If SearchStr = "" Then
For X = 1 To Len(Data) + 1
If NuPos <= UBound(DataArray) Then
SearchStr = SearchStr & Chr(DataArray(NuPos))
NuPos = NuPos + 1
End If
Next
End If
If NuPos <= UBound(DataArray) And StartPos < MaxPos Then
If InStr(History, SearchStr & Chr(DataArray(NuPos))) <> 0 Then
'is maximum compression length reached?
If Len(SearchStr) = 258 Then
History = TempHistory
HistPos = TempHistPos
MaxHistory = TempMaxHistory
If StartPos - StartFrom < 3 Then
For X = 1 To StartPos - StartFrom
Call AddBitsToStream(Stream(0), 0, 1)
Call AddBitsToStream(Stream(3), ASC(Left(Data, 1)), 8)
Call AddToHistory(Left(Data, 1))
Data = Mid(Data, 2)
Next
Check_For_Better_Match = True
Else
Data = Left(Data, StartPos - StartFrom)
Position = StartPos
Check_For_Better_Match = False
End If
Exit Function
End If
SearchStr = SearchStr & Chr(DataArray(NuPos))
NuPos = NuPos + 1
Else
If Len(SearchStr) < 3 Then
StartPos = StartPos + 1
NuPos = StartPos
SearchStr = ""
Else
NewBitGain = Len(SearchStr) * 8 - 24 - ((StartPos - StartFrom) * 9)
If NewBitGain > StartBitGain Then
History = TempHistory
HistPos = TempHistPos
MaxHistory = TempMaxHistory
If StartPos - StartFrom < 3 Then
For X = 1 To StartPos - StartFrom
Call AddBitsToStream(Stream(0), 0, 1)
Call AddBitsToStream(Stream(3), ASC(Left(Data, 1)), 8)
Call AddToHistory(Left(Data, 1))
Data = Mid(Data, 2)
Next
Check_For_Better_Match = True
Else
Data = Left(Data, StartPos - StartFrom)
Position = StartPos
Check_For_Better_Match = False
End If
Exit Function
Else
StartPos = StartPos + 1
NuPos = StartPos
SearchStr = ""
End If
End If
End If
End If
Loop
History = TempHistory
HistPos = TempHistPos
MaxHistory = TempMaxHistory
Check_For_Better_Match = False
End Function
Private Sub init_LZSS()
Dim X As Integer
For X = 0 To 3
ReDim Stream(X).Data(10)
Stream(X).BitPos = 0
Stream(X).Buffer = 0
Stream(X).Position = 0
Next
History = ""
HistPos = 1
End Sub
'this sub will add an amount of bits to a certain stream
Private Sub AddBitsToStream(Toarray As LZSSStream, Number As Integer, Numbits As Integer)
Dim X As Long
If Numbits = 8 And Toarray.BitPos = 0 Then
If Toarray.Position > UBound(Toarray.Data) Then ReDim Preserve Toarray.Data(Toarray.Position + 500)
Toarray.Data(Toarray.Position) = Number And &HFF
Toarray.Position = Toarray.Position + 1
Exit Sub
End If
For X = Numbits - 1 To 0 Step -1
Toarray.Buffer = Toarray.Buffer * 2 + (-1 * ((Number And 2 ^ X) > 0))
Toarray.BitPos = Toarray.BitPos + 1
If Toarray.BitPos = 8 Then
If Toarray.Position > UBound(Toarray.Data) Then ReDim Preserve Toarray.Data(Toarray.Position + 500)
Toarray.Data(Toarray.Position) = Toarray.Buffer
Toarray.BitPos = 0
Toarray.Buffer = 0
Toarray.Position = Toarray.Position + 1
End If
Next
End Sub
'this sub will read an amount of bits from the inputstream
Private Function ReadBitsFromArray(FromArray() As Byte, FromPos As Long, FromBit As Byte, Numbits As Integer) As Long
Dim X As Integer
Dim Temp As Long
If FromBit = 0 And Numbits = 8 Then
ReadBitsFromArray = FromArray(FromPos)
FromPos = FromPos + 1
Exit Function
End If
For X = 1 To Numbits
Temp = Temp * 2 + (-1 * ((FromArray(FromPos) And 2 ^ (7 - FromBit)) > 0))
FromBit = FromBit + 1
If FromBit = 8 Then
If FromPos + 1 > UBound(FromArray) Then
Do While X < Numbits
Temp = Temp * 2
X = X + 1
Loop
FromPos = FromPos + 1
Exit For
End If
FromPos = FromPos + 1
FromBit = 0
End If
Next
ReadBitsFromArray = Temp
End Function
Private Function ReadASCFromArray(WhichArray() As Byte, FromPos As Long) As Integer
ReadASCFromArray = WhichArray(FromPos)
FromPos = FromPos + 1
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -