| |

Fortgeschrittene ProgrammierungLZW | |  | Autor: ApfelBaum | Datum: 06.03.04 16:54 |
| Warum kann man bei LzW (die kompr. mit Wörterbuch) nicht mehr als 4096 Wörter komprimieren (oder was das 4096 auch ist)? (beim code-beispiel)
code: it
Private Type BIdx
pLinks As Long
pRechts As Long
Woerterbuchindex As Long
End Type
Dim Woerterbuch(4096) As String
Dim NaechsterWoerterbuchindex As Long
Dim Heap(4096) As BIdx
Dim NaechsterHeapIndex As Long
Dim pStr As Long
Sub InitWoerterbuch()
'In dieser Sub wird das Woerterbuch
'initialisiert und mit Standardwerten belegt
Dim i As Integer
For i = 0 To 255
Woerterbuch(i) = Chr(i)
Next i
NaechsterWoerterbuchindex = 256
NaechsterHeapIndex = 0
End Sub
Function AddToWoerterbuch(s As String) As Long
'In dieser Sub wird dem Woerterbuch ein
'Begriff hinzugefügt
If Len(s) = 1 Then
AddToWoerterbuch = Asc(s)
Else
AddToWoerterbuch = AddToBTree(0, s)
End If
End Function
Function AddToBTree(ByRef Node As Long, ByRef s As String) As Long
Dim i As Integer
If Node = -1 Or NaechsterHeapIndex = 0 Then
Woerterbuch(NaechsterWoerterbuchindex) = s
Heap(NaechsterHeapIndex).Woerterbuchindex = _
NaechsterWoerterbuchindex
NaechsterWoerterbuchindex = NaechsterWoerterbuchindex + 1
Heap(NaechsterHeapIndex).pLinks = -1
Heap(NaechsterHeapIndex).pRechts = -1
Node = NaechsterHeapIndex
NaechsterHeapIndex = NaechsterHeapIndex + 1
AddToBTree = -1
Else
i = StrComp(s, Woerterbuch(Heap(Node).Woerterbuchindex))
If i < 0 Then
AddToBTree = AddToBTree(Heap(Node).pLinks, s)
ElseIf i > 0 Then
AddToBTree = AddToBTree(Heap(Node).pRechts, s)
Else
AddToBTree = Heap(Node).Woerterbuchindex
End If
End If
End Function
Private Sub SchreibeStringBuffer(s As String, s2 As String)
Do While pStr + Len(s2) - 1 > Len(s)
s = s & Space(100000)
Loop
Mid$(s, pStr) = s2
pStr = pStr + Len(s2)
End Sub
Function Komprimieren(IPStr As String) As String
Dim TmpStr As String
Dim Ch As String
Dim Woerterbuchindex As Integer
Dim LetzterWoerterbuchindex As Integer
Dim ErsterBegriffinFolge As Boolean
Dim HalfCh As Integer
Dim i As Long
Dim ostr As String
Call InitWoerterbuch
ErsterBegriffinFolge = True
pStr = 1
For i = 1 To Len(IPStr)
Ch = Mid$(IPStr, i, 1)
Woerterbuchindex = AddToWoerterbuch(TmpStr & Ch)
If Woerterbuchindex = -1 Then
If ErsterBegriffinFolge Then
HalfCh = (LetzterWoerterbuchindex And 15) * 16
Else
SchreibeStringBuffer ostr, Chr(HalfCh Or _
(LetzterWoerterbuchindex And 15))
End If
SchreibeStringBuffer ostr, _
Chr(LetzterWoerterbuchindex \ 16)
ErsterBegriffinFolge = Not ErsterBegriffinFolge
TmpStr = Ch
LetzterWoerterbuchindex = Asc(Ch)
Else
TmpStr = TmpStr & Ch
LetzterWoerterbuchindex = Woerterbuchindex
End If
Next i
SchreibeStringBuffer ostr, _
IIf(ErsterBegriffinFolge, Chr(LetzterWoerterbuchindex \ 16) _
& Chr((LetzterWoerterbuchindex And 15) * 16), _
Chr(HalfCh Or (LetzterWoerterbuchindex And 15)) & _
Chr(LetzterWoerterbuchindex \ 16))
Komprimieren = Left(ostr, pStr - 1)
End Function
Function GC(str As String, position As Long) As Integer
GC = Asc(Mid$(str, position, 1))
End Function
Function DeKomprimieren(IPStr As String) As String
Dim Woerterbuchindex As Integer
Dim ErsterBegriffinFolge As Boolean
Dim i As Long
Dim s As String
Dim s2 As String
Call InitWoerterbuch
pStr = 1
i = 1
ErsterBegriffinFolge = True
Do While i < Len(IPStr)
If ErsterBegriffinFolge Then
Woerterbuchindex = (GC(IPStr, i) * 16) Or _
(GC(IPStr, i + 1) \ 16)
i = i + 1
Else
Woerterbuchindex = (GC(IPStr, i + 1) * 16) Or _
(GC(IPStr, i) And 15)
i = i + 2
End If
ErsterBegriffinFolge = Not ErsterBegriffinFolge
If i > 2 Then
If Woerterbuchindex = NaechsterWoerterbuchindex Or _
(Woerterbuchindex = 256 And _
NaechsterWoerterbuchindex = 4096) Then
AddToWoerterbuch s2 & Left$(s2, 1)
Else
AddToWoerterbuch s2 & Left$(Woerterbuch(Woerterbuchindex), 1)
End If
End If
s2 = Woerterbuch(Woerterbuchindex)
SchreibeStringBuffer s, s2
Loop
DeKomprimieren = Left(s, pStr - 1)
End Function
ich danke schon im Voraus
Bin immer und gerne f?r jede Hilfe da |  |
 LZW | 665 | ApfelBaum | 06.03.04 16:54 |   Re: LZW | 453 | Master | 06.03.04 20:44 |    Re: LZW | 443 | ApfelBaum | 07.03.04 16:36 |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
sevZIP40 Pro DLL 
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere InfosTipp des Monats Oktober 2025 Matthias KozlowskiUmlaute konvertierenErsetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) Access-Tools Vol.1 
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|