Ok, I compressed. Now how do I decompress it?
Posted: Thu Jul 27, 2006 5:34 am
I managed to make a small compression routine based on lzw after a paper. It works, but I can't find a way to decompress the output. Can anyone help? The output is in Outp.s.
Code: Select all
Declare GetNextChar()
Declare StringTable_Init()
Declare StringTable_Add(cp.s)
Declare StringTable_Find(cp.s)
Global TestString.s
Global CurrPos.l
Global Dim StringTable.s(4096)
Global StringTable_Count.l
TestString = "^WED<256>E<260><261><257>B<260>T"
Procedure GetNextChar()
CurrPos = CurrPos + 1
If CurrPos > Len(TestString)
ProcedureReturn -1
Else
ProcedureReturn Asc(Mid(TestString, CurrPos, 1))
EndIf
EndProcedure
Procedure StringTable_Init()
Dim UsedChars.l(256)
For i = 1 To Len(TestString)
UsedChars(Asc(Mid(TestString, i, 1))) = 1
Next i
For i = 0 To 255
If UsedChars(i) = 1
StringTable_Add(Chr(i))
EndIf
Next i
EndProcedure
Procedure StringTable_Add(cp.s)
StringTable(StringTable_Count) = cp
StringTable_Count = StringTable_Count + 1
EndProcedure
Procedure StringTable_Find(cp.s)
For i = 0 To StringTable_Count - 1
If StringTable(i) = cp
ProcedureReturn i
EndIf
Next i
ProcedureReturn -1
EndProcedure
Procedure OutputCode(cp.s)
Global OUTp.s
oCode = StringTable_Find(cp)
OUTp.s = OUTp.s + Chr(oCode)
EndProcedure
CurrentPrefix.s
K.l
StringTable_Init()
CurrentPrefix = ""
Repeat
K = GetNextChar()
If StringTable_Find(CurrentPrefix + Chr(K)) <> -1
CurrentPrefix = CurrentPrefix + Chr(K)
Else
StringTable_Add(CurrentPrefix + Chr(K))
OutputCode(CurrentPrefix)
CurrentPrefix = Chr(K)
EndIf
Until K = -1
Debug Str(Len(TestString))+" > "+ Str(Len(OUTp.s))