home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pcmagazi / pcmanage / sidebar.txt < prev    next >
Text File  |  1990-01-20  |  7KB  |  141 lines

  1. The simplicity of the Lempel-Ziv-Walsh (LZW) compression
  2. algorithm is only surpassed by its power and versatility.  Made
  3. popular by programs such as the shareware programs like ARC (by
  4. System Enhancement Associates) and by PKARC (by Phil Katz), it is
  5. easily implemented as well.
  6.  
  7. The LZW algorithm is a table based one.  Each entry in the table
  8. contains two fields; the first field is a pointer to some other
  9. entry in the table, the second field is a character.  The first
  10. 256 entries in the table is initially populated with each
  11. character field set to the ASCII representation of that entries
  12. offset in the table: the first entry is set to zero, the next to
  13. 1, and so on.  The 65th entry in the table, for example, would
  14. have the character field set to 'A', the ASCII representation of
  15. which is 65.  As will be seen later, the contents of the pointer
  16. field for the first 256 entries in the table need not be
  17. initialized at all, although it is typically set to some illegal
  18. pointer value.  For naming convenience, think of the pointer
  19. field being called the "code" field, and the character field
  20. being called the "suffix" field.
  21.  
  22. If a file contains the sequence "ABC" repeated ad infinitum, an
  23. examination of the resulting operation shows how the LZW
  24. algorithm works.  A couple of rules, first: every unique sequence
  25. of characters (a sequence can be defined as consisting of at
  26. least two characters) read from the file will result in the
  27. generation of a new entry in the table.  And, each sequence of
  28. characters will generate a single code to be output to the
  29. resulting compressed file.
  30.  
  31. The first byte read is a special case. Read the first byte from
  32. the file, the initial 'A'. It exists in the table (the 65th
  33. entry), so output the 12-bit representation of that entry's
  34. offset.  Not very good compression so far: 12 bits of output for
  35. 8 bits of input.  It gets better soon, though.
  36.  
  37. Read the next byte in from the file (the 'B').  The sequence of
  38. characters 'AB' are now looked up in the table, and is found not
  39. to exist. It gets added to the table as the 256th entry (the
  40. table starts at 0).  The character sequence 'AB' can be
  41. considered as the code sequence for the 'A' (entry number 65)
  42. followed by the suffix character 'B': the table entry is a 65B. 
  43. Output the table entry for the suffix character, a 12-bit
  44. representation of the 66th entry in the table.  Two 12 bit
  45. entries have been output to represent 16 bits of input so far.
  46.  
  47. Continue the process for the next character, entering the
  48. representation for 'BC' (66C) into the table as the 257th entry,
  49. and output the 12-bit entry for the 'C'. 36-bits of output for 24
  50. bits of input. Next character read from the file gives thee 258th
  51. entry in the table as 67A and outputs the 12-bit 'C' entry,
  52. number 67. Read the next byte, and get the sequence 'AB'. When we
  53. look it up on the table, we find it as the 256 entry.  Output the
  54. 12-bit code for that entry, read the next character in and
  55. generate a new table entry if the 256C sequence does not already
  56. exist in the table (it doesn't):  entry #259 is set to 256C.  And
  57. the first benefit of the compression is realized: a single 12-bit
  58. code was output for a 16-bit sequence.
  59.  
  60. Read the next byte and the sequence stands at 'CA', found as the
  61. 258th entry. Generate the 12-bit code for output, read the next
  62. character in and create a table entry as 258B.  Again, 12-bits of
  63. output represent 16-bits of input. Reading in the next character
  64. gives the 'BC' sequence (entry #257), reading another byte gives
  65. the '257A' sequence. 257 gets output, table entry 261 is set to
  66. 257A. Read a byte, get 'AB', entry 256. Read a byte, get '256C',
  67. entry 259.  Read a byte, get 259A. It doesn't exist in the table,
  68. so it gets added as entry 262, and the 12-bit code of 259 if
  69. output.  But, 259 represents the sequence 'ABC', and we've only
  70. output 12-bits to represent a 24 bit entry. Reviewing the output
  71. so far, here's what's been output for the processed string of
  72. 'ABCABCABC' (9 bytes * 8 bits = 72 bits):
  73.  
  74.  65 66 67 256 258 257 259 = (7 codes * 12 bits) = 84 bits
  75.  
  76. One more run through gets breakeven, though: The last character
  77. read was a 'C'. Read a byte, get 'CA', entry 258. Read a byte get
  78. 258B, entry 260. Read a byte get 260C, a new entry on the table
  79. (number 262) and output a 260, representing the next three bytes
  80. in the file.  On the input side, 72 + 24 bits.  On the output
  81. side, 84 + 12. Parity has been reached, at 96 bits input and
  82. output.
  83.  
  84. Compression at last: read a byte, sequence 'CA' exists as entry
  85. #258. Read a byte, and look for sequence 258B.  It exists as
  86. entry 260, so read a byte and look for sequence 260C.  It doesn't
  87. exist, gets added to the table, and the 12-bit 260 is generated
  88. for the 24 bit input sequence of 'CAB'. Now we're cooking, with
  89. (96 + 24) on the input side of the equation and (96 + 12) on the
  90. output side of the equation.
  91.  
  92.                     256 - 65   B
  93.                     257 - 66   C
  94.                     258 - 67   A
  95.                     259 - 256  C
  96.                     260 - 258  B
  97.                     261 - 257  A
  98.  
  99.  
  100. This process continues until the input file is exhausted of its
  101. data.  With a repetitive file such as the one above, compression
  102. ratios of more than 70% are not uncommon.
  103.  
  104. So, then, how does the decompressor work?  Like the compressor,
  105. the initial table is set up and the first byte is read.  In the
  106. above instance, this would be a 65. With only one exception
  107. (discussed below) every code read from the input file will
  108. already be on the table.  Like in the compressor, a special case
  109. is made for the first code received: it is remembered as part of
  110. the next entry in the table.  Output the character value for the
  111. 65th entry on the table: the letter 'A gets output.
  112.  
  113. When you get a code, here's what happens:  first, look the code
  114. up on the table.  If found, then recursively read the table,
  115. saving each suffix character on a stack.  When a code is less
  116. than 256, save the suffix on the stack, then output the stack in
  117. reverse (last in, first out) order.
  118.  
  119. So, the "hold" code is a 65, the next code read is a 66.  It is
  120. found on the table, the suffix character is saved on the stack,
  121. then (because the code is less than 256) the recursion loop is
  122. terminated and the stack contents are out:  the letter 'B' is
  123. output.  The combination 65B is now added to the table of the
  124. decompressor as the 256th entry. The last code (66) is remembered
  125. and the next code read in.  A search is made on the table for the
  126. 66th entry.  It is found, and output of 'B' is made, and the 66C
  127. entry is made to the table.
  128.  
  129. Notice how the table generated in the decompressor is exactly the
  130. same as the table generated in the compressor.  Yet, the only
  131. thing output by the compressor ad read by in the decompressor,
  132. the only thing they have in common is the compressed code!  That,
  133. and the initial table, of course.  Reading in the next code,
  134. gives the sequence of 67A, which outputs the 'C' and makes the
  135. next entry in the table equal to 67A.  The next code read is
  136. 256which is found on the table and recursively generates the 'AB'
  137. sequence.  And so on.  Each code is read, is looked up on the
  138. table and then recursively generates a stack of characters, which
  139. is then output in the reverse order.
  140.  
  141.