![]() |
General Programming »
Algorithms & Recipes »
Algorithms
Intermediate
Implementation of LZW Compression and Decompression in VB.NETBy fastalImplementation of Mark Nelson's LZW algorithms in VB.NET. |
VB, Windows, .NET 1.1VS.NET2003, Dev
|
|
Advanced Search |
|
|
|
||||||||||||||||
I am working with a team of VB.NET developers on a large project, and it is best for us to have all of the components in native VB to simplify maintainence and upgrades. I also thought this might be a good introduction to LZW for people who don't know C.
The source code is a nearly direct port of the LZW implementation by Mark Nelson on his web site on C. I even retained many of his comments. Be sure to look at his code here and view his C implementation here.
His original article was published in the October, 1989 issue of Dr. Dobb's Journal, which implies that Mark is very likely at least as ancient as I am.
Start a new Windows Forms project in VB.NET. Add clsLZW.vb to the project. Draw a button in the center of the main form, view the form's code, and paste the following code just above the form's End Class statement:
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
' test the LZW program:
' Place a bunch of files in c:\testdir
' Create c:\testdir\lzw and c:\testdir\postlzw
' Run this program
' test it with a command file such as:
' c:
' cd \testdir
' for %%1 in (*.*) do fc /b %%1
' postlzw\%%1 >> results.txt
Button1.Enabled = False
Dim di As New IO.DirectoryInfo("c:\testdir")
For Each fi As IO.FileInfo In di.GetFiles
' print filename
Dim g As Graphics = Me.CreateGraphics
g.FillRectangle(New SolidBrush(Me.BackColor), _
0, 0, Me.Width, 100)
g.DrawString(fi.Name, Me.Font, Brushes.Black, 0, 0)
g.Dispose()
' compress...
Dim lzw1 As New clsLZW
lzw1.brInput = _
New IO.BinaryReader(IO.File.Open(fi.FullName, _
IO.FileMode.Open))
lzw1.bwOutput = _
New IO.BinaryWriter(IO.File.Open("c:\testdir\lzw\" & _
fi.Name & ".lzw14", _
IO.FileMode.OpenOrCreate, IO.FileAccess.Write))
lzw1.compress()
lzw1.brInput.Close()
lzw1.bwOutput.Close()
' decompress
Dim lzw2 As New clsLZW
lzw2.brInput = _
New IO.BinaryReader(IO.File.Open("c:\testdir\lzw\" _
& fi.Name & ".lzw14", IO.FileMode.Open))
lzw2.bwOutput = _
New IO.BinaryWriter(IO.File.Open("c:\testdir\postlzw\" _
& fi.Name, IO.FileMode.OpenOrCreate, _
IO.FileAccess.Write))
lzw2.expand()
lzw2.brInput.Close()
lzw2.bwOutput.Close()
Next
Button1.Enabled = True
End Sub
To test, create the file structure specified by the comments in the above Sub. You should choose a variety of files.
The batch command 'For %%1...' uses the FileCompare utility (fc) to verify that the uncompressed files match the originals.
If you choose to run it outside of the batch or command file, and at a command prompt, change the three %% to % so it will work.
For %1 in (*.*) do fc /b %1 postlzw\%1 >> results.txt
Refer to the sample code for usage. I have not tested multiple compressions per instantiation of the class, so it is best to create a new instance for each compression or decompression that you wish to complete.
I had to use this to build a multi-file archive, so the calling program maintains control of the streams. Multiple files can be written to the same stream without closing it, however, the input stream is exausted until the end of the file is reached. This can be changed with minor modifications to prevent the need to write temporary files.
Best wishes and good luck with your VB coding!
| You must Sign In to use this message board. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 24 Aug 2006 Editor: Smitha Vijayan |
Copyright 2006 by fastal Everything else Copyright © CodeProject, 1999-2009 Web13 | Advertise on the Code Project |