diff options
-rwxr-xr-x | Demo/zlib/minigzip.py | 147 |
1 files changed, 87 insertions, 60 deletions
diff --git a/Demo/zlib/minigzip.py b/Demo/zlib/minigzip.py index e2801de..87fed4a 100755 --- a/Demo/zlib/minigzip.py +++ b/Demo/zlib/minigzip.py @@ -1,106 +1,133 @@ #!/usr/bin/env python # Demo program for zlib; it compresses or decompresses files, but *doesn't* # delete the original. This doesn't support all of gzip's options. +# +# The 'gzip' module in the standard library provides a more complete +# implementation of gzip-format files. + +import zlib, sys, os FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT = 1, 2, 4, 8, 16 def write32(output, value): - output.write(chr(value & 255)) ; value=value / 256 - output.write(chr(value & 255)) ; value=value / 256 - output.write(chr(value & 255)) ; value=value / 256 + output.write(chr(value & 255)) ; value=value // 256 + output.write(chr(value & 255)) ; value=value // 256 + output.write(chr(value & 255)) ; value=value // 256 output.write(chr(value & 255)) def read32(input): - v=ord(input.read(1)) - v=v+ (ord(input.read(1))<<8 ) - v=v+ (ord(input.read(1))<<16) - v=v+ (ord(input.read(1))<<24) + v = ord(input.read(1)) + v += (ord(input.read(1)) << 8 ) + v += (ord(input.read(1)) << 16) + v += (ord(input.read(1)) << 24) return v -import zlib, sys -if len(sys.argv)!=2: - print 'Usage: minigzip.py <filename>' - print ' The file will be compressed or decompressed.' - sys.exit(0) - -filename=sys.argv[1] -compressing=1 ; outputname=filename+'.gz' -if filename[-3:]=='.gz': - compressing=0 ; outputname=filename[:-3] -input=open(filename) ; output=open(outputname, 'w') - -if compressing: +def compress (filename, input, output): output.write('\037\213\010') # Write the header, ... output.write(chr(FNAME)) # ... flag byte ... - import os # ... modification time ... - statval=os.stat(filename) - mtime=statval[8] + statval = os.stat(filename) # ... modification time ... + mtime = statval[8] write32(output, mtime) output.write('\002') # ... slowest compression alg. ... output.write('\377') # ... OS (=unknown) ... output.write(filename+'\000') # ... original filename ... - crcval=zlib.crc32("") - compobj=zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS, + crcval = zlib.crc32("") + compobj = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS, zlib.DEF_MEM_LEVEL, 0) - while (1): - data=input.read(1024) - if data=="": break - crcval=zlib.crc32(data, crcval) + while True: + data = input.read(1024) + if data == "": + break + crcval = zlib.crc32(data, crcval) output.write(compobj.compress(data)) output.write(compobj.flush()) write32(output, crcval) # ... the CRC ... write32(output, statval[6]) # and the file size. -else: - magic=input.read(2) - if magic!='\037\213': - print 'Not a gzipped file' ; sys.exit(0) - if ord(input.read(1))!=8: - print 'Unknown compression method' ; sys.exit(0) - flag=ord(input.read(1)) +def decompress (input, output): + magic = input.read(2) + if magic != '\037\213': + print 'Not a gzipped file' + sys.exit(0) + if ord(input.read(1)) != 8: + print 'Unknown compression method' + sys.exit(0) + flag = ord(input.read(1)) input.read(4+1+1) # Discard modification time, # extra flags, and OS byte. if flag & FEXTRA: # Read & discard the extra field, if present - xlen=ord(input.read(1)) - xlen=xlen+256*ord(input.read(1)) + xlen = ord(input.read(1)) + xlen += 256*ord(input.read(1)) input.read(xlen) if flag & FNAME: # Read and discard a null-terminated string containing the filename - while (1): - s=input.read(1) - if s=='\000': break + while True: + s = input.read(1) + if s == '\0': break if flag & FCOMMENT: # Read and discard a null-terminated string containing a comment - while (1): + while True: s=input.read(1) - if s=='\000': break + if s=='\0': break if flag & FHCRC: input.read(2) # Read & discard the 16-bit header CRC - decompobj=zlib.decompressobj(-zlib.MAX_WBITS) - crcval=zlib.crc32("") - length=0 - while (1): + + decompobj = zlib.decompressobj(-zlib.MAX_WBITS) + crcval = zlib.crc32("") + length = 0 + while True: data=input.read(1024) - if data=="": break - decompdata=decompobj.decompress(data) - print len(decompdata) - output.write(decompdata) ; length=length+len(decompdata) - crcval=zlib.crc32(decompdata, crcval) - decompdata=decompobj.flush() - output.write(decompdata) ; length=length+len(decompdata) - crcval=zlib.crc32(decompdata, crcval) + if data == "": + break + decompdata = decompobj.decompress(data) + output.write(decompdata) + length += len(decompdata) + crcval = zlib.crc32(decompdata, crcval) + + decompdata = decompobj.flush() + output.write(decompdata) + length += len(decompdata) + crcval = zlib.crc32(decompdata, crcval) # We've read to the end of the file, so we have to rewind in order # to reread the 8 bytes containing the CRC and the file size. The # decompressor is smart and knows when to stop, so feeding it # extra data is harmless. input.seek(-8, 2) - crc32=read32(input) - isize=read32(input) - if crc32!=crcval: print 'CRC check failed.' - if isize!=length: print 'Incorrect length of data produced' + crc32 = read32(input) + isize = read32(input) + if crc32 != crcval: + print 'CRC check failed.' + if isize != length: + print 'Incorrect length of data produced' + +def main(): + if len(sys.argv)!=2: + print 'Usage: minigzip.py <filename>' + print ' The file will be compressed or decompressed.' + sys.exit(0) + + filename = sys.argv[1] + if filename.endswith('.gz'): + compressing = False + outputname = filename[:-3] + else: + compressing = True + outputname = filename + '.gz' + + input = open(filename, 'rb') + output = open(outputname, 'wb') + + if compressing: + compress(filename, input, output) + else: + decompress(input, output) + + input.close() + output.close() -input.close() ; output.close() +if __name__ == '__main__': + main() |