#!/usr/bin/env python import sys stderr = sys.stderr ## LZWDecoder ## class LZWDecoder(object): debug = 0 def __init__(self, fp): self.fp = fp self.buff = 0 self.bpos = 8 self.nbits = 9 self.table = None self.prevbuf = None return def readbits(self, bits): v = 0 while 1: # the number of remaining bits we can get from the current buffer. r = 8-self.bpos if bits <= r: # |-----8-bits-----| # |-bpos-|-bits-| | # | |----r----| v = (v<>(r-bits)) & ((1<>stderr, ('nbits=%d, code=%d, output=%r, table=%r' % (self.nbits, code, x, self.table[258:])) return def main(argv): import StringIO input = '\x80\x0b\x60\x50\x22\x0c\x0c\x85\x01' fp = StringIO.StringIO(input) expected = '\x2d\x2d\x2d\x2d\x2d\x41\x2d\x2d\x2d\x42' LZWDecoder.debug = 1 output = ''.join(LZWDecoder(fp).run()) print (input, expected, output) print output == expected return 0 if __name__ == '__main__': sys.exit(main(sys.argv))