This page has answers to questions that I frequently field on both newsgroups and via email. Please feel free to email me any comments you have regarding these entries.

This page last updated June 3, 2002.

Index

  1. I need the source code to XXX! I need program YYY! Tell me about ZZZ!
  2. Why doesn't the zlib OCX work with VB5?
  3. Where is the comp.compression FAQ?
  4. How do I write a PKZIP clone?
  5. I am looking for source code to compress and decompress data.
  6. Can I use Zlib with Delphi 2.0?
  7. How Do I Use Com Ports under Win32?
  8. What is the Burrows-Wheeler Transform?
  9. I need a library that lets me zip and unzip files
  10. How does dymanic Huffman coding work?
  11. How does arithmetic coding work?
  12. How do I write programs that use serial communications?
  13. What is a heap?
  14. I need compression code for an embedded system
  15. I need to decompress some files compressed with PKWare's library
  16. How do I talk to the comm port under MS-DOS?
  17. Where can I find information on Huffman Coding?
  18. How do I do a diff on two files?
  19. What algorithms are patented?
  20. How does the DCT work?
  21. What is Magic Function Theory?
  22. How do I calculate a CRC?
  23. How do I determine the entropy of some data?
  24. Which compressor is the best?
  25. Tell me about LZW compression?
  26. How do I update items on multiple OCX property pages when they aren't being displayed?
  27. How does the deflate algorithm work?

How do I write a PKZIP clone?

PKWare has not made their source code available for public scrunity. Fortunately, you have a couple of other choices. First, visit the Info-Zip home page and take a look at the C source for Zip and UnZip:

http://www.cdrom.com/pub/infozip/

These two programs are extremely portable among different platforms and compilers. However, the current releases of Zip and UnZip were not written to be library components, they are stand alone applications, so hoisting their code into your own app is not a trivial task.

If you like Java better than C, JDK 1.1. includes a ZipFile class that can be used to manipulate Zip 2.x format archive files. The code is far from bulletproof, (it's very easy to create an invalid Zip file,) so be careful and double check your work. But it is built to be a library component, and as such is pretty easy to work with. As of today, the 1.1 JDK is at:

http://www.javasoft.com:80/products/jdk/1.1/index.html

If you want to roll your own program from scratch, you need two things. First, you need to be able to read and write the Zip directory structure. Second, you need to be able to compress and expand using the deflate algorithm.

Reading and writing the Zip directory structure is not too hard, especially if you don't try to support some of the more esoteric options, such as encryption or disk spanning. (A product I wrote for Greenleaf Software (http://www.greenleafsoft.com) called ArchiveLib is a C++ library that does just that.)

Recreating the deflate algorithm is considerably more difficult. To avoid too much work, you can drop in the zlib package as your compressor. The zlib source and more info lives at:

http://www.cdrom.com/pub/infozip/zlib/

It is incredibly portable, and plugs into C/C++ programs quite easily.

Zlib has a contributed program from Gilles Vollant called minizip that will show you what you need to do to read and write zip files. It still says it is a beta product after being in the distribution for a couple of years; I don't know if that's good or bad.

I am looking for source code to compress and decompress data.

If you just want working C code to integrate into your project, with as little fuss as possible, you can't go wrong with zlib. This portable C source is easy to use, compresses very well, and is free:

http://www.cdrom.com/pub/infozip/zlib/

zlib has also been integrated into Java as of JDK 1.1 as part of a ZipFile class. More information on compressing file this way can be found on my home page. Follow the links to "Magazine Articles", and locate my 1997 DDJ article "A Fresh Cup of Zip".

If you want to some more in depth knowledge about what your choices are, please buy a copy of my book, "The Data Compression Book, 2nd Edition.", ISBN 1-55851-434-1, M&T Books, available at most good bookstores. To get more info on the book (including a link to order the book from Amazon.com) go to my home page and follow the links to "The Data Compression Book"

The most comprehensive source of pointers to source code is probably in the comp.compression FAQ. You can find links to the comp.compression FAQ by checking the first question on this FAQ.

Can I use Zlib with Delphi 2.0?

I wrote an article for the January 1997 Dr. Dobb's Journal that uses zlib with Delphi 2.0. I link zlib directly into an OCX using Microsoft Visual C++ 4.2. The sample program just compresses and decompress files without attempting to support ZIP format. So it's a good solution for compressing single files, but not much more.

You can find the article on my home page, by following the link to "Magazine Articles" and going to January 1997:

http://www.dogma.net/markn

How Do I Use Com Ports under Win32?

Under 16 bit Windows there was a separate set of functions dealing strictly with com ports. Under Win32 some of them have disappeared. Now opening a port is done using standard file commands. To open a com port using overlapped I/O, you would use a command like this:

handle = CreateFile( "COM2",

                     GENERIC_READ | GENERIC_WRITE,

                     0,

                     NULL,

                     OPEN_EXISTING,

                     FILE_FLAG_OVERLAPPED,

                     NULL );

Once the handle has been opened, you can read and write using ReadFile() and WriteFile().

An overview of the entire set of functions you need to use are in the help system under: Platform SDK and DDK Documentation /Platrform SDK/Windows Base Services/Hardware/Communications /Communication Reference. Just search for "Communication Functions". Be sure to put quotes around the whole thing, or you'll get way too many hits!

Microsoft also supplies a communications OCX you can use to perform serial I/O, search your help file for an example called VCTERM.

The definitive article from Microsoft is "Serial Communications in Win32", by Allen Denver. It includes a sample program that can help get you off the ground. You may need an MSDN subscription to access the article. Microsoft loves reorganizing their web pages, so if this link is broken, do an MSDN search for Allen Denver and it should turn up.

There is also a good article by Eric Woodruff in the July 1997 C/C++ Users Journal titled "Serial Communications under Win32." It discusses the Win32 Comm API, and supplies a C++ class to make it a little easier to use. As far as I know this article is not available on line anywhere on the Internet.

What is the Burrows-Wheeler Transform?

The Burrows-Wheeler transform is a reversible process that reorders a block of data based by a unique application of sorting. The resulting transformed data can be compressed with a great deal of efficiency using conventional techniques. In their paper describing this algorithm, Burrows and Wheeler indicate that Wheeler first encountered the reversible transform in 1983, although I don't think they give any attribution.

There are quite a few good sources of information regarding the BWT on the net. I wrote an article for Dr. Dobb's Journal that was published in 1996. You can find it on my home page by following the link to "Magazine Articles", and going to September 1996:

http://www.dogma.net/markn

The original paper from Burrows and Wheeler is on a DEC web site at:

http://gatekeeper.dec.com/pub/DEC/SRC/research-reports/abstracts/src-rr-124.html

Peter Fenwick has written a number of excellent papers on this transform, including some good ideas on how to best compress the data once transformed. You can get PostScript copies from Mr. Fenwick via his web site:

http://www.cs.auckland.ac.nz/~peter-f/

Finally, Julian Seward has written an excellent program called BZIP that implements the BWT and some of Peter Fenwick's ideas. The program is freeware published under the GNU license. You can get the latest copy from the official bzip siet at:

http://sourceware.cygnus.com/bzip2/index.html

I need a library that lets me zip and unzip files

Greenleaf Software sells a library (that I wrote when employed there) called ArchiveLib that will do this for you. It is a C++ class library, but it has a C wrapper that lets you use it from C, as well as VB, Delphi, et. al. You can get a demo of the product that demonstrates only a subset of features from Greenleaf's web page at:

http://www.gleaf.com

Most of the code in ArchiveLib is my work, but the actual compression and decompression code is pulled straight from zlib with virtually no modifications. You can get more information on this incredibly good piece of freeware at:

http://www.cdrom.com/pub/infozip/zlib/

Unfortunately, zlib is a compression engine only; any archiving functions have to be built on top of it. There isn't anything too difficult about that, but unless your time is *very* cheap you will be better off paying for a library.

If you can work in a Java environment, JDK 1.1 has a ZipFile class that can read and write Zip files. More information on compressing file this way can be found on my home page. Follow the links to "Magazine Articles", and locate my 1997 DDJ article "A Fresh Cup of Zip":

http://www.dogma.net/markn

How does dymanic Huffman coding work?

My book, "The Data Compression Book, 2nd ed." has source code and a detailed explanation of dynamic Huffman coding. To get more info on the book (including a link to order the book from Amazon.com) go to my home page and follow the links to "The Data Compression Book":

http://www.dogma.net/markn

The source code included in the book is fairly portable, you ought to be able to adapt it to your purposes without too much trouble.

The book should be available in well stocked technical bookstores, if not you can follow a directed pointer to amazon.com from my web page.

You can find a copy of Jeffrey Vitter's seminal paper, "Design and Analysis of Dynamic Huffman Codes", on his home page at:

http://www.cs.duke.edu/~jsv/ftpdir/Papers/catalog/

Note that the prolific Vitter has quite a few other papers relating to data compression online.

My page also has pointers to other resources, where you might find additional information you need.

How does arithmetic coding work?

My book, "The Data Compression Book, 2nd ed." has source code and a detailed explanation of arithmetic coding. To get more info on the book (including a link to order the book from Amazon.com) go to my home page and follow the links to "The Data Compression Book":

http://www.dogma.net/markn

The source code included in the book is fairly portable, you ought to be able to adapt it to your purposes without too much trouble.

The book should be available in well stocked technical bookstores, if not you can follow a directed pointer to amazon.com from my web page. My page also has pointers to other resources, where you might find additional information you need.

In particular, one good source of free information is the comp.compression FAQ, available all over the net. You can find links to it on my FAQ, accessible from my home page.

How do I write programs that use serial communications?

Serial communications isn't complicated, but it is made more difficult by the fact that it is non-standardized and very platform-dependent.

If you are programming for MS-DOS, you will need to write an interrupt driven handler for the RS-232 ports. Only the most trivial output-only applications can use the BIOS functions built into the PC. Anything that needs reliable input needs to use interrupts.

Win16 and Win32 supply drivers that take care of that problem. All you have to learn with those is how to use the API, which is significantly different between the two platforms.

For the DOS interrupt handlers you will need to hoist some code into your app. There are sources for PD and freeware code, as well as shareware libraries, with various degrees of utility and quality. Personally, I recommend purchasing a copy of my book, "Serial Communications: A C++ Developer's Guide." (Yes, you can consider that a plug!) To get more info on the book (including a link to order the book from amazon.com) go to my home page and follow the links to "Serial Communications: A C++ Developer's Guide":

http://www.dogma.net/markn

My book also covers the use of the Win16 API, but alas, this edition doesn't offer any help for Win32. However, you can find much of what you need in the online reference that comes with your compiler. An overview of the entire set of functions you need to use are in the VC++ 5.0 help system under: Platform SDK and DDK Documentation /Platform SDK/Windows Base Services/Hardware/Communications /Communication Reference. Just search for "Communication Functions". Be sure to put quotes around the whole thing, or you'll get way too many hits!

The definitive article from Microsoft is "Serial Communications in Win32", by Allen Denver. It includes a sample program that can help get you off the ground. You may need an MSDN subscription to access the article. Microsoft loves reorganizing their web pages, so if this link is broken, do an MSDN search for Allen Denver and it should turn up.

For information regarding Win32 comm programming, you might also want to look up an article by Eric Woodruff in the July 1997 C/C++ Users Journal titled "Serial Communications under Win32." It discusses the Win32 Comm API, and supplies a C++ class to make it a little easier to use. As far as I know this article is not available on line anywhere on the Internet.

What is a heap?

I wrote an article in the January 1996 DDJ that discussed how to use the STL priority queues to implement a Huffman coder. The STL does this through the use of four functions that work on standard containers:

You can find the article in back issues of DDJ or by going to my Web page, following the links to "Magazine Articles", and going to January 1996:

http://www.dogma.net/markn

I need compression code for an embedded system

LZO is designed with speed and a small footprint in mind. To quote their web page:

"LZO is a portable lossless data compression library written in ANSI C. It offers pretty fast compression and *very* fast decompression. Decompression requires no memory. "

"In addition there are slower compression levels achieving a quite competitive compression ratio while still decompressing at this very high speed."

You can find LZO at:

http://wildsau.idv.uni-linz.ac.at/mfx/lzo.html

Since it is distributed under the GNU public license, the price should be right. Unfortunately, it is not published under the slightly more flexible GNU Library license. Most people interpret this to mean that you should only use LZO if you are willing to make the source code for your entire product available to the public.

I need to decompress some files compressed with PKWare's library

This is a hazard of using the PKWare data compression library. As far as I know there are *no* public implementations of the algorithm they are using in their data compression library.

You can get a 16 bit DOS version of the library for only $207 from Provantage at www.provantage.com.

PKWare also supplies demo programs on their home page. Maybe you convince one of these programs to unpack the files you are using:

http://www.provantage.com/scripts/go.dll/link/fc_pkwr/www.pkware.com

How do I talk to the comm port under MS-DOS?

If you are programming for MS-DOS, you will need to write an interrupt driven handler for the RS-232 ports. Only the most trival output-only applications can use the BIOS functions built into the PC. Anything that needs reliable input needs to use interrupts.

Win16 and Win32 supply drivers that take care of that problem. All you have to learn with those is how to use the API, which is significantly different between the two platforms.

For the DOS interrupt handlers you will need to hoist some code into your app. There are sources for PD and freeware code, as well as shareware libraries, with various degrees of utility and quality.

I wrote an article a long time ago for Windows/DOS Developer's Journal called "Servicing Comm Port Interrupts." It explains every thing you need to do to access serial ports in 16 Bit MS-DOS apps. You can find the whole article on my web page by following the link to "Magazine Articles", and going way back in the past to May 1990:

http://www.dogma.net/markn

While you're on my web page, you might want to follow the link to my book, "Serial Communications: A C++ Developer's Guide." The book covers MS-DOS interrupt programming, as well as the use of the Win16 API for talking to the comm ports.

Where can I find information on Huffman Coding?

You can find a detailed explanation, with full source code in "The Data Compression Book". An overview of the book, along with ordering info can be found via a link from my home page:

http://www.dogma.net/markn

The comp.compression FAQ has a less detailed explanation, but it does a good job of covering the topic in a lot less space, and it's free too. You can find the comp.compression FAQ via a link on my FAQ, follow the links from my home page.

One last thing: I wrote an article in Dr. Dobb's Journal called "Priority Queues and the STL." It may not sound like it, but it has a good explanation of how you can use heaps when creating a Huffman coder. From my home page, follow the link to "Magazine Articles", then go to January 1996.

How do I do a diff on two files?

The May 1995 issue of DDJ has an article called "A Cross-Platform Binary Diff", by Kris Coppieters.

In some ways performing a diff on two files is a compression problem. I wrote an article called "Fast String Searching With Suffix Trees" in Dr. Dobb's Journal. You can find the article online by going to my home page, following the link to "Magazine Articles", then going down to August 1996:

http://www.dogma.net/markn

If you create a suffx tree using the contents of File A, you can then work your way through File B, repetitively finding the longest match offset/length pairs for the contents of B. All you have to do after that is compress the offset/length output, and you should have a pretty good diff file. (Find the optimal one is a lot harder.)

What algorithms are patented?

The best overview I know of on this topic can be found in the comp.compression FAQ. You can find the comp.compression FAQ via a link on my FAQ, follow the links from my home page.

comp.compression and comp.compression.research sometimes will turn up answers to questions regarding specific techniques, but the murkiness of patent law makes it hard to trust *any* source of information.

Finally, to see the body of these patents, IBM is doing a public service by keeping a giant database of patents onlline. You can reach the IBM patent server at:

http://patent.womplex.ibm.com/

How does the Discrete Cosine Transform Work?

In "The Data Compression Book, 2nd ed." I have a fairly detailed explanation of what the DCT is and how it's used in JPEG compression. I tried to make it an explanation that you could understand without being a mathematician. You can get information on the book, along with pointers to order from Amazon off my home page at:

http://www.dogma.net/markn

What is Magic Function Theory?

This is a recurring theme in comp.compression, which I call "The Magic Function Theory." It sounds like a good idea, but analysis shows that it won't work.

For example, many people decide that a random number generator with just the right seed could be found to spit out a particular sequence of bytes. Sounds plausible, right?

Imagine then that I'm trying to compress a four byte sequence using a random number generator with a one byte seed value. If I can get this to work I'm going to get 4:1 compression, which would be nice.

Here's the problem. If my random number generator has an eight bit seed, it is only going to be able to generate 256 different sequences. So if I'm trying to compress a four byte sequence, I have only a very small chance of a match.

Well, your natural next thought is this: my generator can spit out way more sequences that just 256, because it runs in a cyle that is a gazillion bytes long! So instead of just compressing to a single byte, how about compressing to a two byte sequence that gives the random number seed, plus an offset into the output string. By using two bytes I can compress a four byte string down to two bytes, which is 2:1 compression on every string. Still pretty good!

Nope, you are still in trouble. Adding the offset lets you produce a lot more output sequences, but you still only have 256*256, which is 65536. The total of all possible strings to compress is 256*256*256*256, or about 4 billion. Thus, your compressor is only going to be able to compress about one in 65536 of all possible four byte strings.

As you fiddle and tweak with your function, you're going to find that it takes a minimum of four bytes to create a function that can match all four byte sequences. This argument scales up or down to any size sequence you want. The net results is always the same: you cannot create a function using X bytes that will generate all sequences of length Y, when X is less than Y.

The good news for Magic Function Theory is that it is very applicable to lossy compression. For example, the JPEG algorithm has a magic function called the Inverse DCT. The IDCT is a function in the same sense as the random number generator: it's a simple procedure, you feed it numbers, and you get an output string. The random number generator gets a seed, the IDCT gets a set of coefficients. What makes it *really* magic (as opposed to the non-magic random number generator) is that you can represent a whole bunch of different output blocks using a single set of coefficients. The process of figuring out what those coefficients should be is the quantization step. The reason a single set of coefficients can represent multiple, different blocks is that we're satisfied the different blocks all look reasonably similar to the single set out output data. Unfortunately, for raw binary data that needs to be compressed in a lossless fashion, there is no such thing as "meaningless" output. And that's why it does't work.

How do I calculate a CRC?

I published a short article in the May 1992 Dr. Dobb's Journal called "File Verification Using CRC". It has a short explanation of what a CRC is and includes C source code to calculate a commonly used 32 bit CRC sanctioned by what was then the CCITT. You can find the article on my web page at::

http://www.dogma.net/markn/

Follow the links to "Magazine Articles", then go down to May 1992.

How do I determine the entropy of some data?

In compression, the entropy of a string is usually determined with respect to a given model. So the entropy of a string can vary wildly depending on what model will be used to compress it. The entropy of a text with respect to an order-0 probability model might be quite different than that of the same string when using an LZW type dictionary compressor.

The concept of "absolute" entropy ventures into mathematics and is less useful for practical data compression. As I understand it, Kolmogorov Complexity is described by the smallest combination of program+data needed to produce a given string. It's a very satisfying idea, but I believe that in general only God knows the lowest value for any given string.

Which compressor is the best?

Jeff Gilchrist maintains a page with some fairly comprehensive tests on current versions of most popular archiving programs. The results are stored at:

http://www.geocities.com/SiliconValley/Park/4264/act.html

The page is updated on a monthly basis, so check back often! I believe he normally posts a message to comp.compression when an update occurs.

Tell me about LZW compression?

LZW compression was the state of the art in the 80s. Terry Welch published his seminal paper in the June 1984 issue of IEEE Computer, describiing a fairly efficient implementation of the LZ78 algorithm published by Ziv and Lempel in IEEE Transactions on Information Theory, September 1978. An excellent free implementation of this algorithm soon was available on the then-much-smaller Internet, in the form of the compress program.

LZW compression soon found its way into image compression formats, such as GIF and TIFF, modem data compression standards, such as V.42bis, and general purpose compression programs such as ARC. The use of LZW may have even been more widespread were it not for the fact that Unisys was assigned US Patent number 4558302 for the algorithm. (Or to be more precise, a method and apparatus for implementing the algorithm.) The stealth enforcement of this patent in the 90s was quite a surprise to authors of programs that included GIF display code in their products!

My book, "The Data Compression Book, 2nd ed." has source code and a detailed explanation of LZW compression. You can find out more about the book by following its link on my home page:

http://www.dogma.net/markn

The source code included in the book is fairly portable, you ought to be able to adapt it to your purposes without too much trouble.

The book should be available in well stocked technical bookstores, if not you can follow a directed pointer to amazon.com from my web page. My page also has pointers to other resources, where you might find additional information you need. If you follow the links to "Magazine Articles" from my home page, you will find an article on LZW that I published in Dr. Dobb's Journal in October, 1989.

One additional source of information on LZW compression (as well as many other compression tpics) is the comp.compression FAQ, available all over the net. You can find a link to it on my home page, by following the links from my FAQ.

How do I update items on multiple OCX property pages when they aren't being displayed?

I had a real tough time with this. Items in one of my pages affected other pages, so they need to be updated when a control changes. There are a couple of problems at work here, at least as far as I can tell.

First, the pages don't get created when the property sheet first pops up. Instead, creation is postponed until the first time they are actually displayed. Second, there doesn't appear to be any reliable method to intercepting the command to show the page. I believe this is because the property page frame is the one who's dealing with the visibility issues.

My solution doesn't do things exactly the way you want, but it did work for me. Each time time a control value changes, and I need to update other values in other pages, I go to my parent's parent, which is the master property dialog. I then send a private message to all of that window's children indicating that something has changed. They get indiscriminately blasted, and anyone who has been created and is paying attention can update, visible or not.

This is a nasty way of doing it, but I haven't been able to come up with the "right" way.

How does the deflate algorithm work?

Zip files use what is commonly called the deflate algorithm. Deflate normally uses LZSS compression with a 32K sliding window, with the output of the LZSS compressor further compressed via a pair of Huffman coders.

The most comprehensible public source for the deflate algorithm is in the freely available zlib package. The zlib source and more info lives at:

http://www.cdrom.com/pub/infozip/zlib/

To learn about the details of the format, you can get a pretty coherent explanation from RFC 1951. To learn about how the algorithms (LZSS and Huffman coding) actually work, please buy a copy of my book, "The Data Compression Book, 2nd Edition.", ISBN 1-55851-434-1, M&T Books, available at most good bookstores. To get more info on the book (including a link to order the book from Amazon.com) go to my home page and follow the links to "The Data Compression Book":

http://www.dogma.net/markn

Where is the comp.compression FAQ?

One of the best sources of information regarding compression, algorithms, source code, people, and frauds is the comp.compression FAQ. It has a substantial amount of information, and is kept up to date by Jean-loup Gailly. It's always a good idea to check the FAQ before posting a question in this forum, there is a good chance it has already been answered (usually quite throroughly) in the FAQ:

The three parts of the FAQ are available via FTP, but you can use a browser as a front end if you go to:

http://www.faqs.org/faqs/

If you want to grab a copy sans HTML, there are several handy sites. I usuall go to:

ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/comp/compression/

The garbo archive in Finland has copies of it as well, look for a file with a name like faqcxxxx.zip in the following directory:

ftp://garbo.uwasa.fi/pc/doc-net/

Why doesn't the zlib OCX work with VB5?

The zlib OCX that I published in the January 1997 Dr. Dobb's Journal created a simple control that could be used to perform raw compression on a single file at a time. (Unfortunately, some users are getting the OCX sans documentation, and have the mistaken notion that it will work with ZIP format archives.) The control was written using Visual C++ 4.2, with MFC handling all of the ActiveX work.

Unfortunately, the older versions of MFC seem to have some problems with VB5 and recent versions of other languages. For reasons that don't seem to have anything to do with zlib, users of this OCX are finding that it GPFs or otherwise behaves poorly in their environments.

Rather than spending a lot of time trying to debug MFC, I instead built a new version of the OCX using Visual C++ 5.0 and the Active Template Library (ATL). The ATL is Microsoft's framework of the month, so presumably it should work properly with all of their products.

So far it seems as though the new version of the control is working properly. I'm posting a copy of it here for you to use as you wish. Keep in mind that this is not a supported product, and I disclaim any responsibility for problems encountered with it. I haven't released the source code for this product yet, because I still consider it a possiblity that I may fix some problems.

Please give this new code a try to see if it works properly for you. I'll try to fix any problems, and eventually to publish a released version of the product along with full source code. For now, you will have to download just ZlibOCX2.dll, and register it on your system using either REGSVR32.EXE or your development environment.

I need the source code to XXX! I need program YYY! Tell me about ZZZ!

I get a lot of requests for information such as this. My position as curator of DataCompression.info doesn't make me an expert, and it definitely doesn't mean I have this information at my fingertips. If I can't provide the answer from memory, it means one of use has to go to work searching the net. Since you are the one needing the help, it only seems fair that you do the searching. ;-)

My recommended search algorithm is given below. If you perform the steps listed below in the given order, you should be able to find the answer as quickly as I would be able to.

Mark's Data Compression Search Algorithm:

  1. Search the comp.compression FAQ.
  2. Go the relevant page on DataCompression.info and carefully look through the entries.
  3. Go the search page on DataCompression.info and follow all of the results found there.
  4. Go to Google and perform a Web search.
  5. Go to Google/Groups and use the Advanced Search to comb through comp.compression posts.
  6. Go to a University library and read my book. There are several other fine books that you can look through as well. You could even go to Amazon.com and buy it! Go to the DataCompression.info Books page for many choices.
  7. Post to comp.compression and see if any of the experts online can help solve your program.
If you can't answer your question after taking these steps, please contact me! Your problem must be both interesting and difficult if it has taken you this far.
Return to Mark Nelson's Home Page
Copyright (c) 1995-2002, Mark Nelson, All Rights Reserved.